Objetivos

Este informe detalla el estudio realizado sobre un dataset que recoge información relevante de las viviendas en la ciudad de Agnes, en Iowa (Estados Unidos). El estudio, intentará mediante un modelo de regresión lineal múltiple, predecir el valor de la vivienda en función de un gran número de variables (tanto continuas como categóricas)

Para el control de versiones utilizaremos github. El repositorio se encuentra en https://github.com/AnaFernandezCruz/MetodosAnalisisDatos .

Antes de empezar a realizar el estudio debemos unificar los datos. Inicialmente los disponemos en tres archivos csv, ‘train.csv’, ‘test.csv’ y ‘sample_submission.csv’. Una vez unificados los datos bajo un mismo dataset, separaremos los datos en dos. Uno para realizar el estudio que más adelante lo utilizaremos como train y test, este sera el 90% del dataset completo. Y el segundo para validación, lo utilizaremos para validar nuestro modelo y sera el 10% del dataset completo.

# Cargamos los tres archivos
train_kaggle_ok <- read_csv('./Dataset/train.csv')
test_kaggle <- read_csv('./Dataset/test.csv')
test_kaggle_pk <- read_csv('./Dataset/sample_submission.csv')

# Merge el dataset test y sample_submission, ahora tendremos un dataset completo
test_kaggle_ok <- merge(test_kaggle, test_kaggle_pk, by="Id")

# Unificamos los dos dataset train.csv y test.csv
full_dataset <- rbind(train_kaggle_ok, test_kaggle_ok)

#Dividimos el dataset 10% - 90%
list_split <- full_dataset %>% split_dataframe(.1)

validation <- list_split[[1]]  # 10%
dataset <- list_split[[2]]     # 90%

#Guardamos el dataset de validacion en un archivo csv
write.csv(validation, './validation.csv', row.names=F)

El dataset que utilizaremos para realizar el estudio contiene 2628 observaciones y está dividido en 81 variables distintas, en las que una de ellas es la clave principal (denominada Id) que no debermos tener en cuenta en el análisis de regresión. De estas variables, 43 son discretas y 38 son contínuas. Vemos a simple vista que hay una gran cantidad de “missings” (datos faltantes), tendremos que analizar estas variables para una posible imputación de datos.

Observando la documentación del dataset y los datos una vez cargados, nos damos cuenta que algunas variables categoricas tiene una categoria denominada ‘NA’, cuando cargamos los datos, el programa traduce estas categorias a datos faltantes y no es cierto.

Variables afectadas:

Alley: NA-> No alley access, BsmtQual: NA-> No Basement, BsmtCond: NA-> No Basement, BsmtExposure: NA-> No Basement, BsmtFinType1: NA-> No Basement, BsmtFinType2: NA-> No Basement, GarageType: NA-> No Garage, GarageFinish: NA-> No Garage, GarageQual: NA-> No Garage, GarageCond: NA-> No Garage, PoolQC: NA-> No Pool, Fence: NA-> No Fence, MiscFeature: NA-None

Una vez cargados los datos, imputaremos a esas columnas, en los datos faltantes, la categoria NA. Supondremos que para estas columnas no existe ningún valor genuinamente vacío.

cols_remove_nas <-c('Alley','BsmtQual','BsmtCond','BsmtExposure','BsmtFinType1','BsmtFinType2','GarageType','GarageFinish','GarageQual','GarageCond','PoolQC','Fence','MiscFeature','FireplaceQu')

dataset <- dataset %>% dplyr::mutate_at(cols_remove_nas, 
          list(~ifelse(is.na(.), 'NA',.)) )

Una vez que nos aseguramos la integridad de los datos en todo el conjunto del estudio, separamos estos datos en dos grupos: train (70%) y test (30%).

#Dividimos el dataset 70% - 30%
list_split <- dataset %>% split_dataframe(.7)

train <- list_split[[1]]  # 70%
test <- list_split[[2]]   # 30%

Análisis exploratorio inicial de los datos (EDA)

summary(dataset)
##        Id           MSSubClass      MSZoning          LotFrontage    
##  Min.   :   1.0   Min.   : 20.0   Length:2628        Min.   : 21.00  
##  1st Qu.: 754.8   1st Qu.: 20.0   Class :character   1st Qu.: 59.00  
##  Median :1475.5   Median : 50.0   Mode  :character   Median : 68.00  
##  Mean   :1475.5   Mean   : 56.8                      Mean   : 69.33  
##  3rd Qu.:2206.2   3rd Qu.: 70.0                      3rd Qu.: 80.00  
##  Max.   :2919.0   Max.   :190.0                      Max.   :313.00  
##                                                      NA's   :441     
##     LotArea          Street             Alley             LotShape        
##  Min.   :  1300   Length:2628        Length:2628        Length:2628       
##  1st Qu.:  7445   Class :character   Class :character   Class :character  
##  Median :  9436   Mode  :character   Mode  :character   Mode  :character  
##  Mean   : 10156                                                           
##  3rd Qu.: 11558                                                           
##  Max.   :215245                                                           
##                                                                           
##  LandContour         Utilities          LotConfig          LandSlope        
##  Length:2628        Length:2628        Length:2628        Length:2628       
##  Class :character   Class :character   Class :character   Class :character  
##  Mode  :character   Mode  :character   Mode  :character   Mode  :character  
##                                                                             
##                                                                             
##                                                                             
##                                                                             
##  Neighborhood        Condition1         Condition2          BldgType        
##  Length:2628        Length:2628        Length:2628        Length:2628       
##  Class :character   Class :character   Class :character   Class :character  
##  Mode  :character   Mode  :character   Mode  :character   Mode  :character  
##                                                                             
##                                                                             
##                                                                             
##                                                                             
##   HouseStyle         OverallQual      OverallCond     YearBuilt   
##  Length:2628        Min.   : 1.000   Min.   :1.00   Min.   :1872  
##  Class :character   1st Qu.: 5.000   1st Qu.:5.00   1st Qu.:1954  
##  Mode  :character   Median : 6.000   Median :5.00   Median :1973  
##                     Mean   : 6.089   Mean   :5.58   Mean   :1971  
##                     3rd Qu.: 7.000   3rd Qu.:6.00   3rd Qu.:2001  
##                     Max.   :10.000   Max.   :9.00   Max.   :2010  
##                                                                   
##   YearRemodAdd   RoofStyle           RoofMatl         Exterior1st       
##  Min.   :1950   Length:2628        Length:2628        Length:2628       
##  1st Qu.:1965   Class :character   Class :character   Class :character  
##  Median :1993   Mode  :character   Mode  :character   Mode  :character  
##  Mean   :1984                                                           
##  3rd Qu.:2004                                                           
##  Max.   :2010                                                           
##                                                                         
##  Exterior2nd         MasVnrType          MasVnrArea      ExterQual        
##  Length:2628        Length:2628        Min.   :   0.0   Length:2628       
##  Class :character   Class :character   1st Qu.:   0.0   Class :character  
##  Mode  :character   Mode  :character   Median :   0.0   Mode  :character  
##                                        Mean   : 102.7                     
##                                        3rd Qu.: 164.0                     
##                                        Max.   :1600.0                     
##                                        NA's   :20                         
##   ExterCond          Foundation          BsmtQual           BsmtCond        
##  Length:2628        Length:2628        Length:2628        Length:2628       
##  Class :character   Class :character   Class :character   Class :character  
##  Mode  :character   Mode  :character   Mode  :character   Mode  :character  
##                                                                             
##                                                                             
##                                                                             
##                                                                             
##  BsmtExposure       BsmtFinType1         BsmtFinSF1     BsmtFinType2      
##  Length:2628        Length:2628        Min.   :   0.0   Length:2628       
##  Class :character   Class :character   1st Qu.:   0.0   Class :character  
##  Mode  :character   Mode  :character   Median : 371.0   Mode  :character  
##                                        Mean   : 445.4                     
##                                        3rd Qu.: 736.5                     
##                                        Max.   :5644.0                     
##                                        NA's   :1                          
##    BsmtFinSF2        BsmtUnfSF       TotalBsmtSF     Heating         
##  Min.   :   0.00   Min.   :   0.0   Min.   :   0   Length:2628       
##  1st Qu.:   0.00   1st Qu.: 222.0   1st Qu.: 796   Class :character  
##  Median :   0.00   Median : 475.0   Median : 990   Mode  :character  
##  Mean   :  47.29   Mean   : 562.9   Mean   :1056                     
##  3rd Qu.:   0.00   3rd Qu.: 808.0   3rd Qu.:1300                     
##  Max.   :1474.00   Max.   :2336.0   Max.   :6110                     
##  NA's   :1         NA's   :1        NA's   :1                        
##   HeatingQC          CentralAir         Electrical           1stFlrSF   
##  Length:2628        Length:2628        Length:2628        Min.   : 334  
##  Class :character   Class :character   Class :character   1st Qu.: 880  
##  Mode  :character   Mode  :character   Mode  :character   Median :1082  
##                                                           Mean   :1163  
##                                                           3rd Qu.:1389  
##                                                           Max.   :5095  
##                                                                         
##     2ndFlrSF       LowQualFinSF       GrLivArea     BsmtFullBath   
##  Min.   :   0.0   Min.   :  0.000   Min.   : 334   Min.   :0.0000  
##  1st Qu.:   0.0   1st Qu.:  0.000   1st Qu.:1125   1st Qu.:0.0000  
##  Median :   0.0   Median :  0.000   Median :1441   Median :0.0000  
##  Mean   : 332.9   Mean   :  4.136   Mean   :1500   Mean   :0.4311  
##  3rd Qu.: 702.2   3rd Qu.:  0.000   3rd Qu.:1740   3rd Qu.:1.0000  
##  Max.   :2065.0   Max.   :697.000   Max.   :5642   Max.   :3.0000  
##                                                    NA's   :2       
##   BsmtHalfBath        FullBath        HalfBath      BedroomAbvGr  
##  Min.   :0.00000   Min.   :0.000   Min.   :0.000   Min.   :0.000  
##  1st Qu.:0.00000   1st Qu.:1.000   1st Qu.:0.000   1st Qu.:2.000  
##  Median :0.00000   Median :2.000   Median :0.000   Median :3.000  
##  Mean   :0.06055   Mean   :1.567   Mean   :0.379   Mean   :2.857  
##  3rd Qu.:0.00000   3rd Qu.:2.000   3rd Qu.:1.000   3rd Qu.:3.000  
##  Max.   :2.00000   Max.   :4.000   Max.   :2.000   Max.   :8.000  
##  NA's   :2                                                        
##   KitchenAbvGr   KitchenQual         TotRmsAbvGrd    Functional       
##  Min.   :0.000   Length:2628        Min.   : 2.00   Length:2628       
##  1st Qu.:1.000   Class :character   1st Qu.: 5.00   Class :character  
##  Median :1.000   Mode  :character   Median : 6.00   Mode  :character  
##  Mean   :1.045                      Mean   : 6.44                     
##  3rd Qu.:1.000                      3rd Qu.: 7.00                     
##  Max.   :3.000                      Max.   :15.00                     
##                                                                       
##    Fireplaces     FireplaceQu         GarageType         GarageYrBlt  
##  Min.   :0.0000   Length:2628        Length:2628        Min.   :1895  
##  1st Qu.:0.0000   Class :character   Class :character   1st Qu.:1960  
##  Median :1.0000   Mode  :character   Mode  :character   Median :1979  
##  Mean   :0.5978                                         Mean   :1978  
##  3rd Qu.:1.0000                                         3rd Qu.:2002  
##  Max.   :4.0000                                         Max.   :2207  
##                                                         NA's   :138   
##  GarageFinish         GarageCars      GarageArea      GarageQual       
##  Length:2628        Min.   :0.000   Min.   :   0.0   Length:2628       
##  Class :character   1st Qu.:1.000   1st Qu.: 322.0   Class :character  
##  Mode  :character   Median :2.000   Median : 480.0   Mode  :character  
##                     Mean   :1.769   Mean   : 473.4                     
##                     3rd Qu.:2.000   3rd Qu.: 576.0                     
##                     Max.   :5.000   Max.   :1488.0                     
##                     NA's   :1       NA's   :1                          
##   GarageCond         PavedDrive          WoodDeckSF     OpenPorchSF    
##  Length:2628        Length:2628        Min.   :  0.0   Min.   :  0.00  
##  Class :character   Class :character   1st Qu.:  0.0   1st Qu.:  0.00  
##  Mode  :character   Mode  :character   Median :  0.0   Median : 26.00  
##                                        Mean   : 93.1   Mean   : 47.43  
##                                        3rd Qu.:168.0   3rd Qu.: 70.00  
##                                        Max.   :870.0   Max.   :742.00  
##                                                                        
##  EnclosedPorch       3SsnPorch        ScreenPorch        PoolArea      
##  Min.   :   0.00   Min.   :  0.000   Min.   :  0.00   Min.   :  0.000  
##  1st Qu.:   0.00   1st Qu.:  0.000   1st Qu.:  0.00   1st Qu.:  0.000  
##  Median :   0.00   Median :  0.000   Median :  0.00   Median :  0.000  
##  Mean   :  23.04   Mean   :  2.598   Mean   : 16.37   Mean   :  2.501  
##  3rd Qu.:   0.00   3rd Qu.:  0.000   3rd Qu.:  0.00   3rd Qu.:  0.000  
##  Max.   :1012.00   Max.   :508.000   Max.   :576.00   Max.   :800.000  
##                                                                        
##     PoolQC             Fence           MiscFeature           MiscVal        
##  Length:2628        Length:2628        Length:2628        Min.   :    0.00  
##  Class :character   Class :character   Class :character   1st Qu.:    0.00  
##  Mode  :character   Mode  :character   Mode  :character   Median :    0.00  
##                                                           Mean   :   54.74  
##                                                           3rd Qu.:    0.00  
##                                                           Max.   :17000.00  
##                                                                             
##      MoSold           YrSold       SaleType         SaleCondition     
##  Min.   : 1.000   Min.   :2006   Length:2628        Length:2628       
##  1st Qu.: 4.000   1st Qu.:2007   Class :character   Class :character  
##  Median : 6.000   Median :2008   Mode  :character   Mode  :character  
##  Mean   : 6.211   Mean   :2008                                        
##  3rd Qu.: 8.000   3rd Qu.:2009                                        
##  Max.   :12.000   Max.   :2010                                        
##                                                                       
##    SalePrice     
##  Min.   : 34900  
##  1st Qu.:154975  
##  Median :176520  
##  Mean   :180058  
##  3rd Qu.:191657  
##  Max.   :755000  
## 

A continuación, dividiremos las variables en las siguientes categorías, para facilitar su estudio.

El siguiente código realiza la descomposición en dichas categorías para usar con posterioridad:

var_continuas <- c('LotFrontage','LotArea','MasVnrArea','BsmtFinSF1','BsmtFinSF2','BsmtUnfSF','TotalBsmtSF','1stFlrSF','2ndFlrSF','LowQualFinSF','GrLivArea','GarageArea','WoodDeckSF','OpenPorchSF','EnclosedPorch', '3SsnPorch','ScreenPorch','PoolArea','MiscVal','SalePrice')

var_discretas <- c('BsmtFullBath','BsmtHalfBath','FullBath','HalfBath','BedroomAbvGr','KitchenAbvGr','TotRmsAbvGrd','Fireplaces','GarageCars','GarageYrBlt','YearBuilt','YearRemodAdd','YrSold','MoSold')

var_ordinales <- c('LotShape','Utilities','LandSlope','OverallQual','OverallCond','ExterQual','ExterCond','BsmtQual','BsmtCond','BsmtExposure','BsmtFinType1','BsmtFinType2','HeatingQC','CentralAir','Electrical','KitchenQual','Functional','FireplaceQu','GarageFinish','GarageQual','GarageCond','PavedDrive','PoolQC','Fence')

var_nominales <- c('MSSubClass','MSZoning','Street','Alley','LandContour','LotConfig','Neighborhood','Condition1','Condition2','BldgType','HouseStyle','RoofStyle','RoofMatl','Exterior1st',
'Exterior2nd','MasVnrType','Foundation','Heating','GarageType','MiscFeature', 'SaleType','SaleCondition')

Detección, tratamiento e imputación de datos faltantes

Variables continuas:

missing_data_continuas <- train %>% dplyr::select(var_continuas) %>% plot_missing(theme_config = list(legend.position = "bottom", axis.text.x =element_text(angle = 90),axis.text.y = element_text(size = rel(1))))

Variables discretas:

missing_data_discretas <- train %>% dplyr::select(var_discretas) %>% plot_missing(theme_config = list(legend.position = "bottom", axis.text.x =element_text(angle = 90),axis.text.y = element_text(size = rel(1))))

Variables discretas ordinales:

missing_data_ordinales <- train %>%  dplyr::select(var_ordinales)  %>% plot_missing(theme_config = list(legend.position = "bottom", axis.text.x =element_text(angle = 90),axis.text.y = element_text(size = rel(1))))

Variables nominales:

missing_data_nominales <- train %>%  dplyr::select(var_nominales)  %>% plot_missing(theme_config = list(legend.position = "bottom", axis.text.x =element_text(angle = 90),axis.text.y = element_text(size = rel(1))))

Como hay muchas variables que no tienen valores faltantes, vamos a crear un dataset únicamente con las columnas que tienen missings para poder analizar mejor los datos.

var_missing <- c(var_missing_continuas, var_missing_discretas, var_missing_nominales, var_missing_ordinales)

train_na <- train %>% dplyr::select(var_missing)

na_counts <- sapply(train_na, function(x) sum(is.na(x)))
na_counts_sort <- sort(na_counts, decreasing = TRUE)
(na_counts_sort)
##  LotFrontage  GarageYrBlt   MasVnrType   MasVnrArea BsmtFullBath BsmtHalfBath 
##          314           96           17           16            2            2 
##     MSZoning   BsmtFinSF1   BsmtFinSF2    BsmtUnfSF  TotalBsmtSF   GarageArea 
##            2            1            1            1            1            1 
##   GarageCars     SaleType  Exterior2nd  Exterior1st   Electrical  KitchenQual 
##            1            1            1            1            1            1
aggr_plot <- aggr(train_na,col=c('navyblue','red'), numbers=TRUE, sortVars=TRUE, cex.axis=.7, gap=3, ylab=c("Histogram of missing data","Pattern"))

## 
##  Variables sorted by number of missings: 
##      Variable        Count
##   LotFrontage 0.1707449701
##   GarageYrBlt 0.0522022838
##    MasVnrType 0.0092441544
##    MasVnrArea 0.0087003806
##  BsmtFullBath 0.0010875476
##  BsmtHalfBath 0.0010875476
##      MSZoning 0.0010875476
##    BsmtFinSF1 0.0005437738
##    BsmtFinSF2 0.0005437738
##     BsmtUnfSF 0.0005437738
##   TotalBsmtSF 0.0005437738
##    GarageArea 0.0005437738
##    GarageCars 0.0005437738
##      SaleType 0.0005437738
##   Exterior2nd 0.0005437738
##   Exterior1st 0.0005437738
##    Electrical 0.0005437738
##   KitchenQual 0.0005437738

Ahora podemos prestar verdadera atención a las columnas con datos faltantes.

Si nos fijamos en la columna que más datos faltantes tiene, podemos ver en la descripción del dataset que son la cantidad de pies lineales que hay de acera hasta la puerta de la casa. Además, leyendo la documentación del dataset vemos que los NA’s no significa que no tengan conexión con la acera (un edificio de varios pisos por ejemplo), sino que son datos faltantes.

Proporción de datos faltantes

Hemos considerado que una variable con más de un 15% de datos faltantes nos va a desbalancear el dataset drásticamente, por lo que vamos a prescindir de este valor para nuestro estudio y para la imputación de missings, por lo que la borramos del dataset.

Para el caso en el que la proporción de datos faltantes sea menor que el 3% (0.03) imputaremos a los valores faltantes de variables cuantitativas su mediana o media, mientras que a las variables categóricas les imputaremos la categoría más frecuente.

Para las columnas en que la proporcion de datos faltantes sea superior al 3% (0.03) tendremos que utilizar técnicas de imputación más avanzadas. Si en nuestro dataset se diera el caso en el que existen varias columnas de este último tipo habría que realizar un análisis de sensibilidad para comprobar que no hemos alterado la naturaleza del dataset imputando los datos faltantes.

Solo nos faltaría una variable por imputar sus valores: GarageYrBlt. Esta variable indica el año en el que se construyó el garaje de la propiedad. No lo vamos a imputar con el valor medio ya que la proporción de datos faltantes es mayor al 3%, así que lo que proponemos para su imputación es lo siguiente:

Como conocemos el vecindario al que pertenecen los pisos, es lógico que el año de construcción del garaje sea similar para todo el vecindario. Vamos a proceder a agrupar los garages por vecindario e imputaremos el año medio correspondiente.

## [1] 1839

Y ya tendríamos todas las columnas con datos faltantes imputadas.

Analisis y procesado de variables

Ahora comenzaremos con el análisis univariante de los datos del dataset. Empezaremos dicho análisis mostrando un conjunto de histogramas.

Variables nominales:

train %>%  dplyr::select(var_nominales) %>% plot_bar(nrow =2,ncol=2)

A la vista de estos histogramas, observamos lo siguiente:

 gr1 <- ggplot(train[!is.na(train$SalePrice),], aes(x=Neighborhood, y=SalePrice)) +
        geom_bar(stat='summary', fun.y = "median", fill='blue') +
        theme(axis.text.x = element_text(angle = 45, hjust = 1)) +
        scale_y_continuous(breaks= seq(0, 1800000, by=20000), labels = comma) +
        geom_label(stat = "count", aes(label = ..count.., y = ..count..), size=3) +
        geom_hline(yintercept=150000, linetype="dashed", color = "red") 

gr2 <- ggplot(data=train, aes(x=Neighborhood)) +
        geom_histogram(stat='count')+
        geom_label(stat = "count", aes(label = ..count.., y = ..count..), size=3)+
        theme(axis.text.x = element_text(angle = 45, hjust = 1))

grid.arrange(gr1, gr2)

Una posible manera de quitarnos esta molesta variable es discretizándola por un umbral de precio de venta medio en la zona. Podríamos llamar a las dos colecciones “zona cara” y “zona normal”.

La otra variable categórica que se podría tratar de la misma forma que la anterior es una varible que clasifica a la casa según un cojunto cerrado de valores que a priori no tiene un significado claro para nosotros. Mostramos las mismas gráficas para esta variable para ver si se puede seguir una estrategia similar a la de la anterior variable:

gr1 <- ggplot(train[!is.na(train$SalePrice),], aes(x=MSSubClass, y=SalePrice)) +
        geom_bar(stat='summary', fun.y = "median", fill='blue') +
        theme(axis.text.x = element_text(angle = 45, hjust = 1)) +
        scale_y_continuous(breaks= seq(0, 800000, by=50000), labels = comma) +
        geom_label(stat = "count", aes(label = ..count.., y = ..count..), size=3) +
        geom_hline(yintercept=150000, linetype="dashed", color = "red") 

gr2 <- ggplot(data=train, aes(x=MSSubClass)) +
        geom_histogram(stat='count')+
        geom_label(stat = "count", aes(label = ..count.., y = ..count..), size=3) +
        theme(axis.text.x = element_text(angle = 45, hjust = 1))

grid.arrange(gr1, gr2)

Estas variables pueden ser problemáticas al realizar el proceso de regresión lineal para el que este tipo de variables puede ser problemático, por no contar que para estos modelos este tipo de variables tienen muy poco poder predictivo.

El siguiente código detectara las variables que tienen baja varianza e intentara eliminar todas aquellas que no sean significativas en una regresión de ella con la variable salePrice.

elementosBajaVarianza <- nearZeroVar(train,freqCut = 95/5,uniqueCut = 10)

var_eliminar_correlacion <- c()

# estas columna dan problemas, la varible 3SnnPorch empieza por un número y a la hora de ejecutar el modelo para ver si son significativas en la regresión  
var_to_remove = c(var_to_remove,'3SsnPorch')

for(i in colnames(train)[elementosBajaVarianza]) {
  if(i != '3SsnPorch') {
    modelRegression <- lm(reformulate(termlabels = i, response = 'SalePrice') ,data=train)
    if(lmp(modelRegression) >.05) {
      var_eliminar_correlacion = c(var_eliminar_correlacion,i)
    }
  }
}

var_to_remove <- c(var_to_remove,var_eliminar_correlacion)

Las siguientes variables se eliminaran del dataset:

(var_eliminar_correlacion)
## [1] "Street"       "Utilities"    "LandSlope"    "Condition2"   "LowQualFinSF"
## [6] "Functional"   "MiscFeature"  "MiscVal"

Variables ordinales:

train %>% dplyr::select(var_ordinales) %>% plot_bar(nrow =2,ncol=2)

No son otra cosa que variables categóricas pero que encierran una relación de orden interna. El tratamiento de estas variables para transformarlas en categóricas y cambiar el ordenamiento alfabético que R les da por defecto.

Se observan práctimante las mismas anomalías en en el caso anterior, variables con distribuciones muy alejadas de la normalidad y en muchos casos dichas variables apenas aportan información debido a que la mayoría de los valores están concentrados en una única categoría.

Variables contínuas:

#var_continuas <- c('LotArea','MasVnrArea','BsmtFinSF1','BsmtFinSF2','BsmtUnfSF','TotalBsmtSF','1stFlrSF','2ndFlrSF','LowQualFinSF','GrLivArea','GarageArea','WoodDeckSF','OpenPorchSF','EnclosedPorch', '3SsnPorch','ScreenPorch','PoolArea','MiscVal','SalePrice')

train %>% dplyr::select(var_continuas) %>% plot_histogram(nrow =2,ncol=2)

Los comentarios que se pueden hacer en este caso son los siguientes:

var_to_remove <- c(var_to_remove,'Id')

Nos centraremos ahora en mostrar con mas detalle los histograma y diagramas de densidad de las variables que describen el tamaño en superficie de cada parte en la que se compone una casa:

(Pc-> Pies cuadrados) (Mc-> Metros cuadrados) (Rooms-> Habitaciones)

s1 <- ggplot(data= train, aes(x=GrLivArea)) +
        geom_density() + labs(x='Pc habitables')
s2 <- ggplot(data=train, aes(x=as.factor(TotRmsAbvGrd))) +
        geom_histogram(stat='count') + labs(x='nº rooms encima del sótano')
s3 <- ggplot(data= train, aes(x=`1stFlrSF`)) +
        geom_density() + labs(x='Pc - 1ª planta')
s4 <- ggplot(data= train, aes(x=`2ndFlrSF`)) +
        geom_density() + labs(x='Pc - 2ª planta')
s5 <- ggplot(data= train, aes(x=TotalBsmtSF)) +
        geom_density() + labs(x='Mc - sótano')
s6 <- ggplot(data= train[train$LotArea<100000,], aes(x=LotArea)) +
        geom_density() + labs(x='Mc - jardin')
#s7 <- ggplot(data= train, aes(x=LotFrontage)) +
#        geom_density() + labs(x='Tamaño en metros cuadrados del jardin frontal')
s8 <- ggplot(data= train, aes(x=LowQualFinSF)) +
        geom_histogram() + labs(x='Espacio no habitable 1ª y 2ª')

#layout <- matrix(c(1,2,5,3,4,8,6,7),4,2,byrow=TRUE)
grid.arrange(s1, s2, s3, s4, s5, s6, s8)

Variables discretas:

train %>% dplyr::select(var_discretas) %>% plot_histogram(nrow =2,ncol=2)

Comentarios parecidos a el análisis de distribución de las variables contínuas se pueden hacer para estas variables. No obstante merece la pena recalcar que algunas de estas variables (YearBuilt,YearRemodAdd y YrSold) codifican años. En estos casos, para simplificar el modelo y debido a la irregular distribución de las mismas, se dividirán estas variables en rangos (de, por ejemplo, 20 años) y se creará una faceta representando esta división en el apartado de tratamiento de variables cuantitativas.

Variable SalePrice:

Ahora nos ocuparemos del análisis de la variable dependiente de nuestro modelo, el precio de las casas. En primer lugar dibujaremos su histograma:

ggplot(train, aes(x=SalePrice)) + 
    geom_histogram(aes(y=..density..),      
                   binwidth=7000,
                   colour="black", fill="white") +
    geom_density(alpha=.2, fill="#FF6666")  

Vemos que esta variable tiene un importe sesgo a la izquierda y parece que un cambio de variable de tipo logarítmico podría convertirla en una variable con distribución normal, cosa importante para el modelo lineal de regresión múltiple. El sesgo es muy fácilmente explicable por la naturaleza de la propia variable: la mayoría de las casas deberán tener un precio ajustado a la distribución de la riqueza entre los habitantes de la ciudad, y muy pocas tendrán un gran valor (casas lujosas) o serán infraviviendas. Confirmemos esta hipótesis realizando el cambio de variable en la misma y dibujando su función de distribución normal aproximada:

fitDistribution <- fitdistr(log10(train$SalePrice), densfun = "normal")
  ggplot(data = train) +
  geom_histogram(mapping = aes(x = log10(SalePrice), y = ..density..), col="white") +
  stat_function(fun = dnorm, args = list(mean = fitDistribution$estimate[1], sd = fitDistribution$estimate[2], log = F), 
  color="red", lwd=1)

Vemos que, efectivamente, lo que hemos comentado en el anterior apartado se cumple. Detectamos también que el rango dinámico de la variable es muy grande en su parte derecha sin que apenas haya valores en dicho intervalo, lo que invita a pensar en la presencia de “outliers” (casas de un gran valor económico reservadas a la gente más rica de la ciudad). Dibujaremos sendos diagramas de cajas con la variable original y la variable transformada:

graf3 <- train %>% dplyr::select(SalePrice) %>%
  na.omit() %>%
  ggplot(aes(x=0,y=SalePrice)) +
    geom_boxplot(outlier.colour="black", outlier.shape=16,
             outlier.size=2, notch=FALSE)

graf4 <- train %>% dplyr::mutate(log10_saleprice = log10(SalePrice)) %>%
  dplyr::select(log10_saleprice) %>%
  na.omit() %>%
  ggplot(aes(x=0,y=log10_saleprice)) +
    geom_boxplot(outlier.colour="black", outlier.shape=16,
             outlier.size=2, notch=FALSE)

ggarrange(graf3,graf4)

Vemos claramente la existencia de Outliers en esta variable que la transformación logarítmica no es capaz de resolver, tanto en los valores superiores como en los inferiores. En una parte futura de este apartado, detectaremos y almacenaremos en sendas variables estos Outliers para todas las variables independientes y tomar una decisión de cómo transformales en los apartados de tratamiento de variables cualitativas y cuantitativas.

Graficos QQ - Variables continuas y discretas

Ahora realizaremos un conjunto de gráficos cuantil/cuantil sobre las variables continuas y discretas para corroborar que hay pocas variables con una distribución normal.

train %>% plot_qq(sampled_rows = 1000L, nrow =2,ncol=2)

Las que más se aproximan a esta distribución son: LotArea, LotFrontage, GrLivArea, TotalBsmtSF y X1stFlrSF. Este diagrama pone en evidencia también la gran cantidad de Outliers que tienen algunas variables.

Almacenaremos el grado de asimetría de dichas variables para en un futuro poder tener un criterio más claro de qué variables son candidatas a un tipo de transformación logarítmica.

var_continuas_discretas = c(var_continuas,var_discretas)
listasVariablesSkewness <-  na.omit(train %>% dplyr::select(var_continuas_discretas)) %>% skewness()
variablesSkewnessAlto <- listasVariablesSkewness[abs(listasVariablesSkewness) > 0.8]  

Correlación

Ahora procedermos a realizar el análisis vivariante de nuestros datos. Empezaremos con analizar los coeficientes de correlación entre las distintas variables. El siguiente diagrama intenta dibujar un mapa de calor de dichas correlaciones para las variables contínuas, pero debido a la gran cantidad de varibles en dicho diagrama no se puede visualizar nada con claridad:

splitDataset <- split_columns(train, binary_as_factor = FALSE)
plot_correlation(na.omit(splitDataset$continuous), type = "c" ,maxcat = 5L,theme_config = list(legend.position = "bottom", axis.text.x =element_text(angle = 90),axis.text.y = element_text(size = rel(0.4))  ))

Matriz de correlaciones - Variables continuas

Crearemos una matriz de correlaciones con las variables continuas para intentar evidencia de mejor forma estos posibles casos de variables fuertemente correlacionadas que podrían desestabilizar el resultado del proceso de regresión lineal:

corrmatrix <-corrr::correlate(na.omit(train %>% dplyr::select(var_continuas)))
rplot(corrmatrix, legend = TRUE, shape = 16,print_cor = TRUE) +theme(axis.text.x = element_text(angle = 90))

Con esta matriz se observan lo siguiente:

cor(train$GrLivArea, (train$`1stFlrSF` + train$`2ndFlrSF` + train$LowQualFinSF))
## [1] 1

Esto es lógico debido a que la suma de las superficies habitables de la primera y segunda planta mas la superficie de “baja calidad” tienen que coicidir con la superficie total habitable sin contar los sótanos. Es por ello que estas variables o hay que transformarlas para evitar este caso de correlación perfecta o bien eliminar del modelo alguna de ellas. La decisión se tomará mas adelante.

A continuación mostraremos un tipo de gráfica que muestra de forma más visual la anterior matriz de correlación. En ella cuando más cerca están unos puntos de otros existe una mayor similitud entre las distintas variables. Cada una de ellas está a su vez enlazada con una “banda” de color azul o rojo que cuantifica el grado de correlación entre las variables. En ella ya vemos que la variable objetivo de estudio, el precio de venta de la casa, está muy influenciada por todas aquellas variables continuas que cuantifican la superficie en la que se dividen las distintas parcelas de la propiedad (habitaciones, garage, porche, sótano, etc.).

network_plot(corrmatrix)

Matriz de correlaciones - Variables discretas

Ahora proseguiremos el análisis con las variables discretas. Como antes, generaremos una matriz de correlación y estudiaremos los resultados:

corrmatrix2 <-corrr::correlate(na.omit(train %>% dplyr::select(var_discretas)))
rplot(corrmatrix2, legend = TRUE, shape = 16,print_cor = TRUE)+theme(axis.text.x = element_text(angle = 90))

network_plot(corrmatrix2)

Matriz de correlaciones - Variables continuas y discretas

Ahora intentaremos hacer este mismo análisis agrupando tanto variables contínuas como discretas, El resultado es el siguiente:

corrmatrix3 <-corrr::correlate(na.omit(train %>% dplyr::select(var_continuas_discretas)))

rplot(corrmatrix3, legend = TRUE, shape = 16,print_cor = TRUE)+theme(axis.text.x = element_text(angle = 90))

network_plot(corrmatrix3)

Aqui Observamos una correlación muy fuerte entre las variables GarageCars y GarageArea, con lo que nos podemos quitar la variable GarageCars.Es lógico pensar que el número de coches que caben en una plaza de garage dependa de la superficie de ésta.

La siguiente función confirmará nuestras sospechas, buscando variables con fuertes correlaciones entre ellas:

correlacionesProblematicas <- findCorrelation(cor(na.omit(train %>% dplyr::select(var_continuas_discretas))),cutoff = 0.8, verbose = FALSE, names = TRUE)

(correlacionesProblematicas)
## [1] "GrLivArea"  "1stFlrSF"   "GarageArea" "YearBuilt"

Comprobamos que, efectivamente, las variables antes comentadas están entre las que aparecen en el listado.

Correlación SalesPrice

Ahora intentaremos mostrar en un gráfico de barras el grado de correlación entre las variables anteriormente analizadas y la variable objeto de nuestro análisis.

correlacionesSalesPrice <-focus(corrmatrix3, SalePrice)

correlacionesSalesPrice%>%  arrange(SalePrice) %>%  ggplot(aes(x=rowname ,y=SalePrice,fill=factor(rowname))) +
  geom_bar(position="dodge",stat="identity") + 
  coord_flip() +
  ggtitle("Correlacion entre las variables numéricas y el precio de las casas")

En este diagrama se muestra más claramente lo que ya se ha comentado con anterioridad: casi todas las variables tienen correlaciones positivas con el precio excepto unas pocas (sería interesante el averiguar por qué, ya que serían factores que influyen negativamente en el precio de una vivienda). Además las variables con mayores correlaciones tiene que ver con la superficie habitable de la casa y la superficie de la primera planta (lo que muestra que la mayoría de las casas tienen una única planta. El tener una segunda planta influye moderadamente en el precio de la vivienda). También hay correlaciones moderadas entre las características del garage, el año de construcción, la superficie del sótano, etc. Por lo tanto, estas variables deberían entrar significativamente en el modelo de regresión que generemos en esta práctica.

Ahora realizaremos unos cuantos diagramas de dispersión entre las variables contínuas y el precio de la vivienda para ver si existen relaciones lineales entre dichas variables (importante para saber si el modelo de regresión lineal es el más adecuado para el problema que tenemos en esta práctica):

na.omit(train %>% dplyr::select(var_continuas)) %>% plot_scatterplot( by = "SalePrice", sampled_rows = 1000L, nrow =2,ncol=2) 

Observamos que sí que existen ciertas relaciones apróximadas pero con algunas anomalías que comentamos a continuación:

En cuanto a la detección de Outliers, como se ha indicado con anterioridad, existen indicios más que suficientes para inferir que, efectivamente, en este dataset existe más de una casa que podría crear problemas en el modelo de regresión lineal. Para detectarlos y almacenarlos en una lista para su posterior tratamiento, ejecutaremos el siguiente código, que además mostrará un conjunto de diagramas de caja con las variables continuas del dataset:

listaOutliers <- list()
#listaBoxPlots <- c()

dataset_var_continuas <- train %>% dplyr::select(var_continuas)

iterator = 1 

for(i in colnames(dataset_var_continuas)) {
  
  outlier_values <- boxplot.stats(dataset_var_continuas[[i]])$out
  
  boxPlotDibujar <- boxplot(dataset_var_continuas[[i]], main=i, boxwex=0.1)
  
  if(i %in% c('LotArea','1stFlrSF','GrLivArea','PoolArea','TotalBsmtSF')) {
    boxPlotDibujar
  }
  
  #listaBoxPlots <- c(listaBoxPlots,boxPlotDibujar)
  
  outliersRosen <- rosnerTest(dataset_var_continuas[[i]], k = 4, warn = F)
  
  listaOutliers[[iterator]] <- outliersRosen
  
  iterator <- iterator +1

}

A continuación, almaceneramos en un conjunto de variables todas las recomendaciones que se han hecho en este punto para proceder en partes posteriores de la práctica a llevar a cabo dichas recomendaciones (eliminar columnas del modelo por posibilidad de autocorrelacines, eliminacion de columnas varias por baja varianza de las mismas, etc).

var_modelo_with_SalePrice = c('SalePrice')

var_columnas_eliminadas = c('TotRmsAbvGrd','GarageYrBlt','GarageCars','TotalBsmtSF','1stFlrSF','2ndFlrSF','BsmtFinSF2','1stFlrSF','2ndFlrSF','FullBath','HalfBath','BsmtFullBath','BsmtHalfBath','OpenPorchSF','3SsnPorch','EnclosedPorch','ScreenPorch','WoodDeckSF','GarageFinish','hasBasement','hasFirePlaces','LotFrontage')

var_columnas_eliminadas_bajo_p_valor = c('LandSlope')

var_transformacion_log = c('TotalSF')

var_eliminar_correlacion = c('TotRmsAbvGrd','GarageYrBlt','GarageCars')

var_to_remove <- c(var_to_remove,var_columnas_eliminadas, var_columnas_eliminadas_bajo_p_valor)

Transformaciones de variables

Union de variables

Ahora procederemos a realizar el procesado de las variables cuantitativas, tanto contínuas como discretas. Lo primero que haremos será contruir 3 nuevas variables como sigue:

Evidentemente, estas variables sustituyen en el modemo final a las variables de las que se componen. Para no destruir información, además, en el apartado de procesado de variables cualitativas crearemos nuevas variables facetadas que indiquen si una casa tiene segundo piso y porche, porque no todas las casas tienen estas dos características. Así nos quitamos el problema que vimos en el apartado de análisis exploratorio con numerosos ceros en algunas de estas variables.

train <- train %>% dplyr::mutate( TotalSF = TotalBsmtSF + `1stFlrSF` + `2ndFlrSF`  )
train <- train %>% dplyr::mutate( Total_Bathrooms = FullBath + 0.5*HalfBath +  BsmtFullBath + 0.5*BsmtHalfBath )
train <- train %>% dplyr::mutate( Total_porch_SF = OpenPorchSF +`3SsnPorch` +  EnclosedPorch + ScreenPorch + WoodDeckSF )
var_creadas_transformacion = c( 'TotalSF','Total_Bathrooms','Total_porch_SF','hasPool','hasGarage','hasBasement','hasFirePlaces','has2ndFloor')
 
train %>%  dplyr::select('TotalSF','Total_Bathrooms','Total_porch_SF') %>% plot_histogram()

Discretizar año de contrucion y de remodelación

Otro procesamiento que realizaremos sobre estas variables es cuantificar las variables que portan los años de reforma y construcción de la casa en rangos de 30 años, para simplificar el modelo final generado. Esta cuantificación transformará estas variables en variables categóricas. El código que realiza la transformación es el siguiente:

train <- train %>% discret_yearsBuiltAndRemod()

Logaritmo

Continuaremos este apartado realizando la transformación logarítmica tanto de la variable SalePrice como de las variables con alto grado de asimetría. Debido a que algunas de estas variables tienen valores nulos, sumaremos uno a la función logarítmica para evitar errores en el cálculo del logaritmo.

variablesTransformar <- names(variablesSkewnessAlto)[!names(variablesSkewnessAlto) %in% var_columnas_eliminadas  & !names(variablesSkewnessAlto) %in% var_eliminar_correlacion ]

variablesTransformar <- c(variablesTransformar,'GrLivArea')

train <- train %>% var_log(variablesTransformar)

Procesado de variables cualitativas

Comenzaremos este apartado creando las siguientes variables como complemento a la información en pies cuadrados de las distintas partes que componen una vivienda:

Habrá que tener cuidado con estas variables al añadirlas al modelo porque podrían estar altamente correladas con las variables que indican el tamaño en superficie de estos 3 elementos.

train <- train %>% create_newFactor()

A continuación transformaremos en columnas de tipo Factor aquellas que tiene valores alfanuméricos y que no parece que tengan un orden natural.

nombresVariablesFactores  <- c('MiscFeature','Alley','Fence','LotConfig','GarageType','MSZoning','Exterior1st','Exterior2nd','Electrical','SaleType','SaleCondition','Foundation','Heating','RoofStyle',
'RoofMatl','LandContour','BldgType','HouseStyle','Neighborhood','Condition1','Condition2','MoSold','YrSold','Street','LotShape','Utilities','LandSlope','MasVnrType','BsmtFinType2','CentralAir','Functional','PavedDrive','hasPool','hasBasement','hasFirePlaces')

train <- train %>% transform_alfa_to_factor(nombresVariablesFactores)

Y por último, todas las variables que encierran una relación de orden en ellas (por ejemplo, que sirven para cuantificar una característica de peor a mejor), se convierten en variables de tipo factor, pero estableciendo los distintos niveles de 0 a el valor máximo en función del valor que representan.

#OverallQual, OverallCond (dejarlas como estan)
levesl1_10 <- c("Very Poor","Poor","Fair","Below Average","Average","Above Average","Good","Very Good","Excellent","Very Excellent")

train <- train %>% dplyr::mutate( ExterQual:=fct_relevel(ExterQual,return_position1_5))

train <- train %>% dplyr::mutate( ExterCond := fct_relevel(ExterCond,return_position1_5))

train <- train %>% dplyr::mutate( HeatingQC := fct_relevel(HeatingQC,return_position1_5))

train <- train %>% dplyr::mutate( KitchenQual := fct_relevel(KitchenQual,return_position1_5))

train <- train %>% dplyr::mutate( GarageQual := fct_relevel(GarageQual,return_position1_5))

train <- train %>% dplyr::mutate( GarageCond := fct_relevel(GarageCond,return_position1_5))

train <- train %>% dplyr::mutate( BsmtQual := fct_relevel(BsmtQual,return_position1_6))

train <- train %>% dplyr::mutate( BsmtCond := fct_relevel(BsmtCond,return_position1_6))

train <- train %>% dplyr::mutate(FireplaceQu := fct_relevel(FireplaceQu,return_position1_6))

train <- train %>% dplyr::mutate( BsmtExposure := fct_relevel(BsmtExposure,return_position1_5_B))

train <- train %>% dplyr::mutate( BsmtFinType1 := fct_relevel(BsmtFinType1,return_position1_7))

train <- train %>% dplyr::mutate( BsmtFinType1 := fct_relevel(BsmtFinType2,return_position1_7))
   
train <- train %>% dplyr::mutate( GarageFinish := fct_relevel(GarageFinish,return_levels_garage))

train <- train %>% dplyr::mutate( PoolQC := fct_relevel(PoolQC,return_levesl_poolQC))

Eliminacion de Outliers

En este partado nos quitaremos los outliers detectados en el apartado segundo de la práctica. Además, quitaremos elementos que tienen un precio muy elevado o demasiados metros cuadrados (unos 4 registros), teniendo en cuenta que las variables las hemos transformado logaritmicamente

# nos quitamos observaciones de casas con excesivo precio y con excesiva superficie
train <- train %>%  dplyr::filter(Id != 1299 & Id !=524 )
train <- train %>%  dplyr::filter(SalePrice  < 13.2 )
train <- train %>%  dplyr::filter(GrLivArea  < 8.4 )

#'LotArea','1stFlrSF','GrLivArea','TotalBsmtSF','Total_porch_SF','TotalSF'

listaPosOutliers <- c()
for(i in colnames(train)) {
  if(is.numeric(train[[i]]) && !is.factor(train[[i]])  ) {
      if(i %in% c('SalePrice'))   {
          outliersRosen <- rosnerTest(train[[i]], k = 5, warn = F)
          #print(outliersRosen$all.stats$Obs.Num)
          listaPosOutliers <- c(listaPosOutliers,outliersRosen$all.stats$Obs.Num)
      }
  }
}

listaPosOutliers <- unique(listaPosOutliers , na.rm=TRUE)
train_sin_na_outliers <- train[-listaPosOutliers,]
#train_sin_na_outliers <- train_sin_na_outliers[-c(358,182),] 
#train_sin_na_outliers <- train %>%  na.omit()

Normalización

Y por último, trataremos de centrar y normalizar todas las variables numéricas una vez convertidas en factores en los anteriores pasos. Esto se realizará pensando sobre todo en el paso de aplicación del método de selección de variables “lasso”, que exige que todas las variables numéricas tengan varianza 1 para evitar sesgos en el modelo resultante.

preProcValuesTrain <- preProcess(train_sin_na_outliers  %>% dplyr::select(-OverallQual, -OverallCond),method = c("center", "scale"))

Selección de variables

Una vez realizado el estudio, localizamos una serie de variables que son candidatas a NO entrar en el modelo. Las columnas que a priori hemos quitado sin justificación, son las siguientes: * ‘ExterCond’,‘PoolArea’,‘PoolQC’,‘Exterior2nd’,‘HeatingQC’,‘Heating’,‘Electrical’: añaden inestabilidad al modelo al introducir autocorrelaciones en el mismo, sobre todo al crear las variables “dummies” en alguna de ellas. Alguna de estas variables además tienen una varianza casi nula en el dataset de entrenamiento, por lo que nos vemos obligados a quitarlas. * ‘MSSubClass’ y ‘Exterior1st’ dan problemas a la hora de crear las variables “dummies” asociadas por los valores que estas columnas tienen. No hemos sido capaces de solventar el problema.

##  [1] "GarageQual"  "hasPool"     "ExterCond"   "PoolArea"    "PoolQC"     
##  [6] "Exterior2nd" "HeatingQC"   "Heating"     "Electrical"  "MSSubClass" 
## [11] "Exterior1st" "Foundation"

Las variables con las que al final SI nos quedaremos para el cálculo del modelo final serán las siguientes:

##  [1] "GrLivArea"       "LotArea"         "Total_Bathrooms" "Total_porch_SF" 
##  [5] "MSZoning"        "LandContour"     "LotConfig"       "Condition1"     
##  [9] "BldgType"        "HouseStyle"      "RoofStyle"       "MasVnrType"     
## [13] "SaleType"        "SaleCondition"   "YearBuilt"       "YearRemodAdd"   
## [17] "MoSold"          "YrSold"          "OverallQual"     "OverallCond"    
## [21] "PavedDrive"      "Fence"           "BsmtFinSF1"      "ExterQual"      
## [25] "BsmtQual"        "BsmtExposure"    "BsmtFinType1"    "BsmtUnfSF"      
## [29] "CentralAir"      "KitchenQual"     "Fireplaces"      "FireplaceQu"    
## [33] "BedroomAbvGr"    "KitchenAbvGr"    "LotShape"        "GarageArea"     
## [37] "GarageCond"      "Neighborhood"    "has2ndFloor"     "Alley"          
## [41] "TotalSF"         "GarageType"      "Total_porch_SF"  "MasVnrArea"     
## [45] "Foundation"      "SalePrice"

Realizamos todas las imputaciones y transformaciones en test.

test <- test %>% imp_mean(imp_cuantitativas)
test <- test %>% imp_mostFre_cat(imp_categoricas)
test <- test %>% imp_mean_yearB()
## [1] 789
test <- test %>% dplyr::mutate( TotalSF = TotalBsmtSF + `1stFlrSF` + `2ndFlrSF`  )
test <- test %>% dplyr::mutate( Total_Bathrooms = FullBath + 0.5*HalfBath +  BsmtFullBath + 0.5*BsmtHalfBath )
test <- test %>% dplyr::mutate( Total_porch_SF = OpenPorchSF +`3SsnPorch` +  EnclosedPorch + ScreenPorch + WoodDeckSF )
test <- test %>% discret_yearsBuiltAndRemod()
test <- test %>% var_log(variablesTransformar)
test <- test %>% create_newFactor()
test <- test %>% transform_alfa_to_factor(nombresVariablesFactores)
test <- test %>% dplyr::mutate( ExterQual:=fct_relevel(ExterQual,return_position1_5))
test <- test %>% dplyr::mutate( ExterCond := fct_relevel(ExterCond,return_position1_5))
test <- test %>% dplyr::mutate( HeatingQC := fct_relevel(HeatingQC,return_position1_5))
test <- test %>% dplyr::mutate( KitchenQual := fct_relevel(KitchenQual,return_position1_5))
test <- test %>% dplyr::mutate( GarageQual := fct_relevel(GarageQual,return_position1_5))
test <- test %>% dplyr::mutate( GarageCond := fct_relevel(GarageCond,return_position1_5))
test <- test %>% dplyr::mutate( BsmtQual := fct_relevel(BsmtQual,return_position1_6))
test <- test %>% dplyr::mutate( BsmtCond := fct_relevel(BsmtCond,return_position1_6))
test <- test %>% dplyr::mutate(FireplaceQu := fct_relevel(FireplaceQu,return_position1_6))
test <- test %>% dplyr::mutate( BsmtExposure := fct_relevel(BsmtExposure,return_position1_5_B))
test <- test %>% dplyr::mutate( BsmtFinType1 := fct_relevel(BsmtFinType1,return_position1_7))
test <- test %>% dplyr::mutate( BsmtFinType1 := fct_relevel(BsmtFinType2,return_position1_7))
test <- test %>% dplyr::mutate( GarageFinish := fct_relevel(GarageFinish,return_levels_garage))
test <- test %>% dplyr::mutate( PoolQC := fct_relevel(PoolQC,return_levesl_poolQC))


preProcValuesTest <- preProcess(test %>% dplyr::select(-OverallQual, -OverallCond,-Id),method = c("center", "scale"))

#test_sin_na <- test %>%  na.omit() %>% dplyr::select(-Id)
#preProcValuesTest <- preProcess(test_sin_na  %>% #dplyr::select(-OverallQual, -OverallCond),method = c("center", "scale"))

#validation_sin_na <- validation %>%  na.omit() %>% dplyr::select(-Id)
#preProcValuesValidation <- preProcess(validation_sin_na  %>% #dplyr::select(-OverallQual, -OverallCond),method = c("center", "scale"))

Por último generamos el modelo de regresión total:

trainTransformed <- predict(preProcValuesTrain, train_sin_na_outliers)
testTransformed <- predict(preProcValuesTest, test)

modelRegressionTotal <- lm(reformulate(termlabels = var_modelo, response = 'SalePrice') ,data=trainTransformed)

cat('El modelo total usa', length(modelRegressionTotal$coefficients), 'variables ')
## El modelo total usa 168 variables

El siguiente código comentado ayudó a eliminar las variables que estaban introduciendo autocorrelaciones en el modelo total, se deja comentado:

#car::vif(modelRegressionTotal)
#alias(modelRegressionTotal)

A continuación, intentaremos reducir la elevada dimensionalidad del modelo utilizando la libreria Caret y haciendo una regresión de tipo “Step Backward selection”, es decir, utilizando el algoritmo que partiendo de todas las variables del modelo vaya creando nuevos modelos quitando cada vez una de las variables que contengan el estimador menos influyente en el modelo hasta converger. Para ello primero relalizamos la codificacion de las varibales categóricas en variables de tipo “dummy”:

dummiesTrain <- dummyVars(reformulate(termlabels = var_modelo_with_SalePrice ),fullRank = T, data = data.frame(trainTransformed),sep='.')

dummiesTest <- dummyVars(reformulate(termlabels = var_modelo_with_SalePrice ),fullRank = T, data = data.frame(testTransformed),sep='.')

trainTransformedDummies <- predict(dummiesTrain, newdata = trainTransformed)

testTransformedDummies <- predict(dummiesTest, newdata = testTransformed)

A continuación, intentaremos reducir la elevada dimensionalidad del modelo con una librería que realiza una “stepwise backward selection”, es decir, parte del modelo total con todas las varibles y va eliminando aquellas que son menos significativas para el modelo hasta que exista una convergencia en el valor R^2 de dicho modelo.

set.seed(seed) 
modelStepForward <- ols_step_forward_p(modelRegressionTotal)
## Forward Selection Method    
## ---------------------------
## 
## Candidate Terms: 
## 
## 1. GrLivArea 
## 2. LotArea 
## 3. Total_Bathrooms 
## 4. Total_porch_SF 
## 5. MSZoning 
## 6. LandContour 
## 7. LotConfig 
## 8. Condition1 
## 9. BldgType 
## 10. HouseStyle 
## 11. RoofStyle 
## 12. MasVnrType 
## 13. SaleType 
## 14. SaleCondition 
## 15. YearBuilt 
## 16. YearRemodAdd 
## 17. MoSold 
## 18. YrSold 
## 19. OverallQual 
## 20. OverallCond 
## 21. PavedDrive 
## 22. Fence 
## 23. BsmtFinSF1 
## 24. ExterQual 
## 25. BsmtQual 
## 26. BsmtExposure 
## 27. BsmtFinType1 
## 28. BsmtUnfSF 
## 29. CentralAir 
## 30. KitchenQual 
## 31. Fireplaces 
## 32. FireplaceQu 
## 33. BedroomAbvGr 
## 34. KitchenAbvGr 
## 35. LotShape 
## 36. GarageArea 
## 37. GarageCond 
## 38. Neighborhood 
## 39. has2ndFloor 
## 40. Alley 
## 41. TotalSF 
## 42. GarageType 
## 43. MasVnrArea 
## 44. Foundation 
## 
## We are selecting variables based on p value...
## 
## Variables Entered: 
## 
## - TotalSF 
## - OverallQual 
## - LotArea 
## - GrLivArea 
## - YearBuilt 
## - OverallCond 
## - MSZoning 
## - KitchenAbvGr 
## - BsmtQual 
## - BedroomAbvGr 
## - GarageArea 
## - Neighborhood 
## - MasVnrType 
## - LandContour 
## - PavedDrive 
## - BsmtFinSF1 
## - SaleCondition 
## - KitchenQual 
## - BldgType 
## - Total_porch_SF 
## - YrSold 
## - Fireplaces 
## - CentralAir 
## - Total_Bathrooms 
## - GarageType 
## - LotShape 
## - Fence 
## - has2ndFloor 
## 
## No more variables to be added.
## 
## Final Model Output 
## ------------------
## 
##                            Model Summary                             
## --------------------------------------------------------------------
## R                       0.744       RMSE                      0.685 
## R-Squared               0.553       Coef. Var          1.600979e+17 
## Adj. R-Squared          0.530       MSE                       0.470 
## Pred R-Squared           -Inf       MAE                       0.531 
## --------------------------------------------------------------------
##  RMSE: Root Mean Square Error 
##  MSE: Mean Square Error 
##  MAE: Mean Absolute Error 
## 
##                                 ANOVA                                  
## ----------------------------------------------------------------------
##                 Sum of                                                
##                Squares          DF    Mean Square      F         Sig. 
## ----------------------------------------------------------------------
## Regression    1009.794          89         11.346    24.146    0.0000 
## Residual       816.206        1737          0.470                     
## Total         1826.000        1826                                    
## ----------------------------------------------------------------------
## 
##                                        Parameter Estimates                                        
## -------------------------------------------------------------------------------------------------
##                model      Beta    Std. Error    Std. Beta      t        Sig      lower     upper 
## -------------------------------------------------------------------------------------------------
##          (Intercept)     0.518         0.664                  0.780    0.436    -0.784     1.819 
##              TotalSF     0.250         0.070        0.250     3.573    0.000     0.113     0.387 
##          OverallQual     0.070         0.024        0.095     2.928    0.003     0.023     0.117 
##              LotArea     0.076         0.021        0.076     3.635    0.000     0.035     0.117 
##            GrLivArea     0.080         0.075        0.080     1.063    0.288    -0.068     0.228 
##   YearBuilt1930_1960     0.286         0.073        0.117     3.907    0.000     0.142     0.429 
##   YearBuilt1960_1990     0.392         0.091        0.177     4.288    0.000     0.213     0.571 
##       YearBuilt1990_     0.442         0.121        0.213     3.665    0.000     0.205     0.678 
##          OverallCond     0.082         0.018        0.091     4.467    0.000     0.046     0.118 
##      MSZoningC (all)    -1.366         0.551       -0.110    -2.478    0.013    -2.447    -0.285 
##           MSZoningFV    -1.293         0.542       -0.274    -2.388    0.017    -2.356    -0.231 
##           MSZoningRH    -1.713         0.545       -0.178    -3.142    0.002    -2.782    -0.644 
##           MSZoningRL    -1.418         0.519       -0.591    -2.731    0.006    -2.436    -0.400 
##           MSZoningRM    -1.488         0.519       -0.543    -2.867    0.004    -2.505    -0.470 
##         KitchenAbvGr    -0.101         0.030       -0.101    -3.343    0.001    -0.161    -0.042 
##           BsmtQualFa     0.018         0.193        0.003     0.095    0.924    -0.360     0.396 
##           BsmtQualTA    -0.331         0.173       -0.165    -1.920    0.055    -0.670     0.007 
##           BsmtQualGd    -0.270         0.180       -0.133    -1.498    0.134    -0.623     0.084 
##           BsmtQualEx    -0.218         0.202       -0.058    -1.080    0.280    -0.614     0.178 
##         BedroomAbvGr     0.095         0.025        0.095     3.865    0.000     0.047     0.144 
##           GarageArea     0.052         0.027        0.052     1.913    0.056    -0.001     0.105 
##  NeighborhoodBlueste    -0.154         0.352       -0.010    -0.438    0.662    -0.845     0.537 
##   NeighborhoodBrDale    -0.443         0.300       -0.041    -1.475    0.140    -1.032     0.146 
##  NeighborhoodBrkSide    -0.381         0.249       -0.071    -1.532    0.126    -0.868     0.107 
##  NeighborhoodClearCr    -0.169         0.249       -0.022    -0.681    0.496    -0.658     0.319 
##  NeighborhoodCollgCr    -0.300         0.207       -0.084    -1.450    0.147    -0.707     0.106 
##  NeighborhoodCrawfor     0.152         0.227        0.030     0.672    0.502    -0.292     0.597 
##  NeighborhoodEdwards    -0.516         0.220       -0.120    -2.344    0.019    -0.948    -0.084 
##  NeighborhoodGilbert    -0.239         0.217       -0.055    -1.105    0.269    -0.664     0.186 
##   NeighborhoodIDOTRR    -0.102         0.265       -0.017    -0.384    0.701    -0.622     0.418 
##  NeighborhoodMeadowV    -0.300         0.269       -0.037    -1.115    0.265    -0.828     0.228 
##  NeighborhoodMitchel    -0.306         0.219       -0.061    -1.394    0.163    -0.736     0.124 
##    NeighborhoodNAmes    -0.302         0.214       -0.111    -1.415    0.157    -0.721     0.117 
##  NeighborhoodNoRidge    -0.035         0.226       -0.006    -0.154    0.878    -0.477     0.408 
##  NeighborhoodNPkVill    -0.269         0.265       -0.026    -1.016    0.310    -0.788     0.250 
##  NeighborhoodNridgHt    -0.204         0.209       -0.044    -0.972    0.331    -0.614     0.207 
##   NeighborhoodNWAmes    -0.412         0.222       -0.084    -1.855    0.064    -0.848     0.024 
##  NeighborhoodOldTown    -0.398         0.245       -0.106    -1.623    0.105    -0.880     0.083 
##   NeighborhoodSawyer    -0.267         0.223       -0.060    -1.196    0.232    -0.704     0.171 
##  NeighborhoodSawyerW    -0.293         0.214       -0.061    -1.372    0.170    -0.712     0.126 
##  NeighborhoodSomerst    -0.395         0.239       -0.096    -1.652    0.099    -0.864     0.074 
##  NeighborhoodStoneBr     0.192         0.233        0.024     0.825    0.410    -0.265     0.650 
##    NeighborhoodSWISU    -0.117         0.251       -0.016    -0.469    0.639    -0.609     0.374 
##   NeighborhoodTimber    -0.267         0.226       -0.043    -1.182    0.237    -0.709     0.176 
##  NeighborhoodVeenker    -0.686         0.275       -0.060    -2.491    0.013    -1.225    -0.146 
##     MasVnrTypeBrkCmn    -0.388         0.238       -0.039    -1.634    0.102    -0.854     0.078 
##    MasVnrTypeBrkFace    -0.191         0.174       -0.087    -1.103    0.270    -0.532     0.149 
##       MasVnrTypeNone    -0.134         0.173       -0.066    -0.779    0.436    -0.473     0.204 
##      MasVnrTypeStone     0.050         0.181        0.013     0.274    0.784    -0.305     0.405 
##       LandContourHLS    -0.117         0.128       -0.024    -0.913    0.362    -0.369     0.135 
##       LandContourLow     0.205         0.159        0.029     1.291    0.197    -0.106     0.516 
##       LandContourLvl     0.164         0.098        0.048     1.680    0.093    -0.027     0.355 
##          PavedDriveP    -0.035         0.138       -0.005    -0.252    0.801    -0.305     0.236 
##          PavedDriveY    -0.257         0.084       -0.071    -3.057    0.002    -0.422    -0.092 
##           BsmtFinSF1     0.035         0.023        0.035     1.500    0.134    -0.011     0.081 
## SaleConditionAdjLand    -0.109         0.282       -0.007    -0.386    0.699    -0.662     0.444 
##  SaleConditionAlloca     0.041         0.216        0.003     0.192    0.847    -0.382     0.465 
##  SaleConditionFamily    -0.009         0.143       -0.001    -0.061    0.952    -0.290     0.272 
##  SaleConditionNormal    -0.008         0.068       -0.003    -0.118    0.906    -0.142     0.126 
## SaleConditionPartial     0.218         0.098        0.059     2.227    0.026     0.026     0.410 
##        KitchenQualTA     0.253         0.116        0.127     2.180    0.029     0.025     0.481 
##        KitchenQualGd     0.338         0.124        0.166     2.727    0.006     0.095     0.582 
##        KitchenQualEx     0.327         0.149        0.077     2.188    0.029     0.034     0.620 
##         KitchenQual4     1.116         0.722        0.026     1.547    0.122    -0.299     2.531 
##       BldgType2fmCon     0.060         0.126        0.009     0.480    0.631    -0.187     0.308 
##       BldgTypeDuplex     0.193         0.157        0.039     1.226    0.220    -0.116     0.501 
##        BldgTypeTwnhs    -0.208         0.136       -0.038    -1.524    0.128    -0.475     0.059 
##       BldgTypeTwnhsE    -0.299         0.091       -0.081    -3.283    0.001    -0.478    -0.120 
##       Total_porch_SF     0.033         0.019        0.033     1.690    0.091    -0.005     0.070 
##           YrSold2007    -0.009         0.049       -0.004    -0.173    0.863    -0.105     0.088 
##           YrSold2008     0.091         0.051        0.037     1.783    0.075    -0.009     0.191 
##           YrSold2009    -0.038         0.051       -0.016    -0.752    0.452    -0.137     0.061 
##           YrSold2010    -0.019         0.060       -0.006    -0.309    0.757    -0.136     0.099 
##           Fireplaces     0.027         0.021        0.027     1.272    0.203    -0.015     0.068 
##          CentralAirY     0.119         0.082        0.028     1.450    0.147    -0.042     0.279 
##      Total_Bathrooms     0.034         0.028        0.034     1.211    0.226    -0.021     0.088 
##     GarageTypeAttchd    -0.019         0.190       -0.009    -0.097    0.922    -0.392     0.355 
##    GarageTypeBasment     0.001         0.262        0.000     0.003    0.998    -0.513     0.515 
##    GarageTypeBuiltIn    -0.001         0.204        0.000    -0.006    0.995    -0.401     0.398 
##    GarageTypeCarPort    -0.515         0.279       -0.042    -1.845    0.065    -1.063     0.032 
##     GarageTypeDetchd    -0.091         0.191       -0.041    -0.477    0.633    -0.465     0.283 
##         GarageTypeNA    -0.168         0.218       -0.036    -0.773    0.440    -0.596     0.259 
##          LotShapeIR2     0.096         0.109        0.015     0.881    0.378    -0.118     0.311 
##          LotShapeIR3     0.026         0.250        0.002     0.104    0.917    -0.464     0.516 
##          LotShapeReg     0.072         0.040        0.035     1.815    0.070    -0.006     0.149 
##            FenceGdWo     0.136         0.119        0.026     1.137    0.256    -0.098     0.370 
##           FenceMnPrv     0.017         0.098        0.005     0.177    0.859    -0.174     0.209 
##            FenceMnWw    -0.385         0.249       -0.027    -1.548    0.122    -0.872     0.103 
##              FenceNA     0.049         0.087        0.019     0.565    0.572    -0.122     0.220 
##      has2ndFloorTrue     0.075         0.070        0.037     1.078    0.281    -0.061     0.211 
## -------------------------------------------------------------------------------------------------
length(modelStepForward$predictors)
## [1] 28
cat('El modelo stepforward usa', length(modelStepForward$model$coefficients), 'variables ')
## El modelo stepforward usa 90 variables

Y por último, utilizando la libreria caret intentarmos obtener una reducción del número de parámetros del modelo mediante una regularización de tipo “lasso”:

cat(' El modelo de lasso usa', varsSelected, 'variables en el modelo, y rechazo ', varsNotSelected, 'variables.')
##  El modelo de lasso usa 59 variables en el modelo, y rechazo  109 variables.

Ajuste, interpretación y diagnosis del modelo de regresión lineal múltiple

En primer lugar almacenaremos los valores de las prediccion para la parte de test en 3 variables distintas:

Una vez evaluados los resultados del dataset de “test” con cada uno de los modelos, intentaremos quedarnos con uno de ellos como el modelo final de la práctica. Para ello, en un primer momento construiremos varias matrices de correlacion entre los resultados predichos por cada uno de los modelos y el resultado final del dataframe “test” e imprimiremos los resultados:

vectorCorrelacionesModeloCompleto <- data.frame(cbind(actuals=testTransformed$SalePrice,predicted=valoresPredichosModeloCompleto))
correlacionModeloCompleto <- cor(vectorCorrelacionesModeloCompleto)

vectorCorrelacionesModeloStepForward <- data.frame(cbind(actuals=testTransformed$SalePrice,predicted=valoresPredichosModeloStepForward))
correlacionModeloStepForward <- cor(vectorCorrelacionesModeloStepForward)

vectorCorrelacionesModeloLasso <- data.frame(cbind(actuals=testTransformed$SalePrice,predicted=valoresPredichosModeloLasso))
correlacionModeloLasso <- cor(vectorCorrelacionesModeloLasso)

cat('Correlacion modelo Completo entre predicciones train/test ',correlacionModeloCompleto[1,2],'\n' )
## Correlacion modelo Completo entre predicciones train/test  0.6513928
cat('Correlacion modelo StepForward entre predicciones train/test',correlacionModeloStepForward[1,2],'\n' )
## Correlacion modelo StepForward entre predicciones train/test 0.6604739
cat('Correlacion modelo Lasso entre predicciones train/test',correlacionModeloLasso[1,2],'\n' )
## Correlacion modelo Lasso entre predicciones train/test 0.6666074

Como vemos, parece ser que el modelo obtenido con Lasso es ligeramente mejor que los otros dos modelos. Ahora imprimiremos por pantalla un resumen con los parámetros “MAE (promedio de la diferencia absoluta entre los valores predichos y el valor observado)”,“MSE (Error cuadrático medio)”,“RMSE (raiz cuadrad del Error cuadrático medio)” y “MAPE (error porcentual absoluto medio)”. En primer lugar para el caso del modelo completo con todas las variables:

library(DMwR)
## Registered S3 method overwritten by 'xts':
##   method     from
##   as.zoo.xts zoo
## Registered S3 method overwritten by 'quantmod':
##   method            from
##   as.zoo.data.frame zoo
## 
## Attaching package: 'DMwR'
## The following object is masked from 'package:plyr':
## 
##     join
## The following object is masked from 'package:VIM':
## 
##     kNN
regr.eval(valoresPredichosModeloCompleto,testTransformed$SalePrice)
##       mae       mse      rmse      mape 
## 0.5981322 0.5886741 0.7672510 2.3506467

En segundo lugar para el caso del modelo “step forward” que se quedó con 80 variables:

regr.eval(valoresPredichosModeloStepForward,testTransformed$SalePrice)
##       mae       mse      rmse      mape 
## 0.5873823 0.5719176 0.7562523 2.7420628

En tercer lugar para el caso del modelo “lasso” que se quedó con 73 variables:

regr.eval(valoresPredichosModeloLasso,testTransformed$SalePrice)
##       mae       mse      rmse      mape 
## 0.5769683 0.5559986 0.7456531 5.1412626

Como vemos, comparando estos tres modelos, el modelo “Lasso” vuelve otra vez a ser ligeramente mejor con menos variables. No obstante, este modelo parece que tiene una R^2 bastante menor que los dos primeros modelos, como podemos comprobar a continuación:

min(lasso_mod$results$Rsquared)
## [1] 0.459557

Con lo que, teoricamente, el modelo Lasso tiene un menor poder de predicción que los otros dos. No obstante, no conseguimos calcular el factor R^2 reducido para este modelo, por lo que no tomareos esta factor como relevante para la selección final del modelo.

Ahora evaluaremos si los tres modelos calulados en los puntos anteriores son válidos. Así, presentaremos el resumen del modelo de regresión total:

library(jtools)
summary(modelRegressionTotal)
## 
## Call:
## lm(formula = reformulate(termlabels = var_modelo, response = "SalePrice"), 
##     data = trainTransformed)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -3.13387 -0.44791  0.00256  0.44824  2.20453 
## 
## Coefficients:
##                         Estimate Std. Error t value Pr(>|t|)    
## (Intercept)            1.4113920  1.1038004   1.279 0.201194    
## GrLivArea              0.0356319  0.0946245   0.377 0.706548    
## LotArea                0.0832213  0.0216017   3.853 0.000121 ***
## Total_Bathrooms        0.0406420  0.0294790   1.379 0.168181    
## Total_porch_SF         0.0417871  0.0199680   2.093 0.036527 *  
## MSZoningC (all)       -1.7634672  0.5893605  -2.992 0.002811 ** 
## MSZoningFV            -1.6450927  0.5727417  -2.872 0.004127 ** 
## MSZoningRH            -1.9941147  0.5760835  -3.462 0.000551 ***
## MSZoningRL            -1.6871939  0.5494687  -3.071 0.002171 ** 
## MSZoningRM            -1.7400217  0.5482170  -3.174 0.001531 ** 
## LandContourHLS        -0.1194609  0.1328773  -0.899 0.368766    
## LandContourLow         0.1856554  0.1648263   1.126 0.260172    
## LandContourLvl         0.1336076  0.1009800   1.323 0.185981    
## LotConfigCulDSac       0.0266725  0.0889243   0.300 0.764256    
## LotConfigFR2          -0.0336705  0.1115905  -0.302 0.762894    
## LotConfigFR3           0.1384836  0.2243904   0.617 0.537217    
## LotConfigInside       -0.0225137  0.0469867  -0.479 0.631894    
## Condition1Feedr        0.0943824  0.1222572   0.772 0.440225    
## Condition1Norm         0.1559748  0.0989512   1.576 0.115152    
## Condition1PosA         0.0044047  0.2142867   0.021 0.983603    
## Condition1PosN         0.0008826  0.1806557   0.005 0.996103    
## Condition1RRAe        -0.0405316  0.2077314  -0.195 0.845327    
## Condition1RRAn         0.1047106  0.1665442   0.629 0.529615    
## Condition1RRNe         0.2550869  0.4388630   0.581 0.561154    
## Condition1RRNn         0.1250182  0.2922414   0.428 0.668859    
## BldgType2fmCon         0.0520823  0.1329270   0.392 0.695248    
## BldgTypeDuplex         0.2358947  0.1672810   1.410 0.158677    
## BldgTypeTwnhs         -0.2256055  0.1422752  -1.586 0.112998    
## BldgTypeTwnhsE        -0.3179294  0.0966285  -3.290 0.001022 ** 
## HouseStyle1.5Unf      -0.3006171  0.2568010  -1.171 0.241919    
## HouseStyle1Story       0.1384638  0.1542612   0.898 0.369533    
## HouseStyle2.5Fin       0.3288805  0.5143517   0.639 0.522646    
## HouseStyle2.5Unf      -0.1523205  0.2073505  -0.735 0.462685    
## HouseStyle2Story       0.0485343  0.0758181   0.640 0.522169    
## HouseStyleSFoyer       0.1540761  0.1907022   0.808 0.419240    
## HouseStyleSLvl         0.1931420  0.1461525   1.322 0.186514    
## RoofStyleGable        -0.0711366  0.2314318  -0.307 0.758596    
## RoofStyleGambrel       0.2202623  0.2955703   0.745 0.456249    
## RoofStyleHip          -0.1129301  0.2352402  -0.480 0.631246    
## RoofStyleMansard      -0.5951065  0.3602737  -1.652 0.098761 .  
## RoofStyleShed          0.0758315  0.3944287   0.192 0.847565    
## MasVnrTypeBrkCmn      -0.3966245  0.2454925  -1.616 0.106365    
## MasVnrTypeBrkFace     -0.1627125  0.1795018  -0.906 0.364820    
## MasVnrTypeNone        -0.0762233  0.1771378  -0.430 0.667030    
## MasVnrTypeStone        0.0873358  0.1859331   0.470 0.638619    
## SaleTypeCOD           -0.4531916  0.7320452  -0.619 0.535951    
## SaleTypeCon            0.0496126  0.8796049   0.056 0.955027    
## SaleTypeConLD         -0.4683400  0.7485165  -0.626 0.531604    
## SaleTypeConLI         -0.3916057  0.7697854  -0.509 0.611016    
## SaleTypeConLw         -0.3736644  0.8107850  -0.461 0.644954    
## SaleTypeCWD           -0.8001411  0.7630768  -1.049 0.294528    
## SaleTypeNew           -0.4830805  0.8936427  -0.541 0.588873    
## SaleTypeOth           -0.4434907  0.7926316  -0.560 0.575885    
## SaleTypeWD            -0.5679371  0.7229556  -0.786 0.432228    
## SaleConditionAdjLand  -0.2030483  0.2956479  -0.687 0.492310    
## SaleConditionAlloca    0.0877704  0.2312992   0.379 0.704390    
## SaleConditionFamily    0.0121412  0.1506497   0.081 0.935776    
## SaleConditionNormal    0.0425377  0.0751876   0.566 0.571637    
## SaleConditionPartial   0.1882063  0.5129083   0.367 0.713711    
## YearBuilt1930_1960     0.3350395  0.0854507   3.921 9.18e-05 ***
## YearBuilt1960_1990     0.4435739  0.1160087   3.824 0.000136 ***
## YearBuilt1990_         0.3609244  0.1436214   2.513 0.012064 *  
## YearRemodAdd1960_1990 -0.0271872  0.0801858  -0.339 0.734613    
## YearRemodAdd1990_      0.0260707  0.0711419   0.366 0.714068    
## MoSold2                0.1093308  0.1164232   0.939 0.347826    
## MoSold3                0.2358325  0.1020066   2.312 0.020903 *  
## MoSold4                0.1814201  0.1002950   1.809 0.070653 .  
## MoSold5                0.1569822  0.0958126   1.638 0.101522    
## MoSold6                0.1753998  0.0938706   1.869 0.061865 .  
## MoSold7                0.1669223  0.0944669   1.767 0.077413 .  
## MoSold8                0.3141875  0.1052425   2.985 0.002874 ** 
## MoSold9                0.2495607  0.1128127   2.212 0.027091 *  
## MoSold10               0.2362937  0.1131084   2.089 0.036852 *  
## MoSold11               0.2432552  0.1116101   2.180 0.029434 *  
## MoSold12               0.3044524  0.1219545   2.496 0.012641 *  
## YrSold2007             0.0015360  0.0511174   0.030 0.976032    
## YrSold2008             0.0883161  0.0527553   1.674 0.094305 .  
## YrSold2009            -0.0440631  0.0521921  -0.844 0.398653    
## YrSold2010             0.0102913  0.0642693   0.160 0.872801    
## OverallQual            0.0765211  0.0258317   2.962 0.003097 ** 
## OverallCond            0.0724237  0.0210777   3.436 0.000605 ***
## PavedDriveP           -0.0498623  0.1418893  -0.351 0.725321    
## PavedDriveY           -0.2525573  0.0876003  -2.883 0.003989 ** 
## FenceGdWo              0.1416291  0.1227149   1.154 0.248613    
## FenceMnPrv             0.0109258  0.1009221   0.108 0.913803    
## FenceMnWw             -0.4048357  0.2553092  -1.586 0.113005    
## FenceNA                0.0417544  0.0901511   0.463 0.643311    
## BsmtFinSF1            -0.0015994  0.0588201  -0.027 0.978310    
## ExterQualTA            0.0064905  0.1962920   0.033 0.973626    
## ExterQualGd            0.0898815  0.2053379   0.438 0.661643    
## ExterQualEx           -0.0201559  0.2413731  -0.084 0.933460    
## BsmtQualFa            -0.1583596  0.5043685  -0.314 0.753579    
## BsmtQualTA            -0.4894670  0.4969358  -0.985 0.324782    
## BsmtQualGd            -0.4545860  0.4999858  -0.909 0.363378    
## BsmtQualEx            -0.3607580  0.5108125  -0.706 0.480136    
## BsmtExposureNo         0.4648613  0.4427787   1.050 0.293930    
## BsmtExposureMn         0.5191918  0.4470943   1.161 0.245704    
## BsmtExposureAv         0.4781059  0.4458609   1.072 0.283732    
## BsmtExposureGd         0.4136343  0.4509642   0.917 0.359160    
## BsmtFinType1Unf       -0.4186669  0.5252735  -0.797 0.425539    
## BsmtFinType1LwQ       -0.4907544  0.5382907  -0.912 0.362064    
## BsmtFinType1Rec       -0.5608850  0.5376851  -1.043 0.297032    
## BsmtFinType1BLQ       -0.5468046  0.5399648  -1.013 0.311367    
## BsmtFinType1ALQ       -0.3895153  0.5548512  -0.702 0.482767    
## BsmtFinType1GLQ       -0.6605665  0.5581335  -1.184 0.236770    
## BsmtUnfSF             -0.0294423  0.0591899  -0.497 0.618958    
## CentralAirY            0.1086796  0.0865710   1.255 0.209517    
## KitchenQualTA          0.2690738  0.1200640   2.241 0.025152 *  
## KitchenQualGd          0.3078490  0.1287587   2.391 0.016918 *  
## KitchenQualEx          0.3316745  0.1567930   2.115 0.034548 *  
## KitchenQual4           1.4065945  0.7481669   1.880 0.060276 .  
## Fireplaces             0.0409421  0.0422480   0.969 0.332642    
## FireplaceQuPo         -0.0284262  0.1492124  -0.191 0.848934    
## FireplaceQuFa          0.0525377  0.1318360   0.399 0.690307    
## FireplaceQuTA         -0.0644353  0.0917450  -0.702 0.482571    
## FireplaceQuGd         -0.0168409  0.0892888  -0.189 0.850420    
## FireplaceQuEx          0.0529790  0.1710873   0.310 0.756858    
## BedroomAbvGr           0.0890904  0.0262505   3.394 0.000705 ***
## KitchenAbvGr          -0.1067125  0.0318726  -3.348 0.000832 ***
## LotShapeIR2            0.0970022  0.1149426   0.844 0.398837    
## LotShapeIR3            0.0378991  0.2545061   0.149 0.881641    
## LotShapeReg            0.0928512  0.0420783   2.207 0.027476 *  
## GarageArea             0.0488266  0.0283385   1.723 0.085080 .  
## GarageCondFa          -0.3791615  0.2723365  -1.392 0.164032    
## GarageCondTA          -0.2805431  0.2535479  -1.106 0.268684    
## GarageCondGd          -0.1546569  0.3775409  -0.410 0.682121    
## GarageCondEx          -0.3448753  0.4842608  -0.712 0.476461    
## GarageCondNA          -0.0213354  0.5813495  -0.037 0.970729    
## NeighborhoodBlueste   -0.1062775  0.3632343  -0.293 0.769875    
## NeighborhoodBrDale    -0.4742697  0.3149990  -1.506 0.132354    
## NeighborhoodBrkSide   -0.3581558  0.2592179  -1.382 0.167257    
## NeighborhoodClearCr   -0.2496151  0.2592060  -0.963 0.335688    
## NeighborhoodCollgCr   -0.3190086  0.2127516  -1.499 0.133949    
## NeighborhoodCrawfor    0.1117193  0.2349013   0.476 0.634421    
## NeighborhoodEdwards   -0.5491327  0.2274569  -2.414 0.015876 *  
## NeighborhoodGilbert   -0.2471815  0.2234358  -1.106 0.268768    
## NeighborhoodIDOTRR    -0.0967137  0.2761777  -0.350 0.726243    
## NeighborhoodMeadowV   -0.3185126  0.2796307  -1.139 0.254848    
## NeighborhoodMitchel   -0.3346507  0.2274500  -1.471 0.141396    
## NeighborhoodNAmes     -0.2857787  0.2217516  -1.289 0.197670    
## NeighborhoodNoRidge   -0.0317804  0.2371999  -0.134 0.893433    
## NeighborhoodNPkVill   -0.2336967  0.2779536  -0.841 0.400595    
## NeighborhoodNridgHt   -0.2744318  0.2189000  -1.254 0.210133    
## NeighborhoodNWAmes    -0.3533958  0.2323523  -1.521 0.128463    
## NeighborhoodOldTown   -0.4445372  0.2571009  -1.729 0.083988 .  
## NeighborhoodSawyer    -0.2510494  0.2318837  -1.083 0.279120    
## NeighborhoodSawyerW   -0.2860482  0.2211470  -1.293 0.196027    
## NeighborhoodSomerst   -0.4204116  0.2479444  -1.696 0.090152 .  
## NeighborhoodStoneBr    0.1096318  0.2386572   0.459 0.646029    
## NeighborhoodSWISU     -0.1255148  0.2610525  -0.481 0.630720    
## NeighborhoodTimber    -0.2940291  0.2325858  -1.264 0.206345    
## NeighborhoodVeenker   -0.6607600  0.2883259  -2.292 0.022047 *  
## has2ndFloorTrue        0.1666604  0.1507685   1.105 0.269144    
## AlleyNA               -0.0960473  0.1018763  -0.943 0.345929    
## AlleyPave              0.0370458  0.1614923   0.229 0.818589    
## TotalSF                0.3028753  0.1113491   2.720 0.006595 ** 
## GarageTypeAttchd      -0.0293498  0.1961504  -0.150 0.881075    
## GarageTypeBasment      0.0201187  0.2729235   0.074 0.941246    
## GarageTypeBuiltIn     -0.0269966  0.2099773  -0.129 0.897714    
## GarageTypeCarPort     -0.4792125  0.2905190  -1.650 0.099234 .  
## GarageTypeDetchd      -0.1064984  0.1963944  -0.542 0.587707    
## GarageTypeNA          -0.4083816  0.5712315  -0.715 0.474763    
## MasVnrArea             0.0230347  0.0269341   0.855 0.392551    
## FoundationCBlock      -0.0242580  0.0826987  -0.293 0.769307    
## FoundationPConc        0.0602857  0.0874093   0.690 0.490483    
## FoundationSlab        -0.1940086  0.2432280  -0.798 0.425193    
## FoundationStone        0.2691380  0.2870502   0.938 0.348587    
## FoundationWood         0.2100327  0.5237200   0.401 0.688442    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.6894 on 1659 degrees of freedom
## Multiple R-squared:  0.5682, Adjusted R-squared:  0.5247 
## F-statistic: 13.07 on 167 and 1659 DF,  p-value: < 2.2e-16

Como vemos el p-valor del modelo es pequeño, por lo que sí que parece que hay relación lineal entre los diferentes regresores y la variable de la que queremos obtener predicciones. Observamos también que hay muy pocas variables con un alto nivel de significancia para el modelo (p-valores marcados con 3 o 2 estrellas).

Ahora realizaremos el mismo proceso para el modelo “BACKWARD STEPWISE”:

summary(modelStepForward$model)
## 
## Call:
## lm(formula = paste(response, "~", paste(preds, collapse = " + ")), 
##     data = l)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -3.1994 -0.4571  0.0114  0.4656  2.2135 
## 
## Coefficients:
##                        Estimate Std. Error t value Pr(>|t|)    
## (Intercept)           0.5175542  0.6637904   0.780 0.435676    
## TotalSF               0.2496442  0.0698600   3.573 0.000362 ***
## OverallQual           0.0698367  0.0238550   2.928 0.003461 ** 
## LotArea               0.0757365  0.0208375   3.635 0.000286 ***
## GrLivArea             0.0800994  0.0753364   1.063 0.287828    
## YearBuilt1930_1960    0.2855554  0.0730797   3.907 9.69e-05 ***
## YearBuilt1960_1990    0.3919279  0.0913968   4.288 1.90e-05 ***
## YearBuilt1990_        0.4418050  0.1205339   3.665 0.000254 ***
## OverallCond           0.0819503  0.0183451   4.467 8.44e-06 ***
## MSZoningC (all)      -1.3661847  0.5512816  -2.478 0.013299 *  
## MSZoningFV           -1.2933205  0.5415675  -2.388 0.017042 *  
## MSZoningRH           -1.7127777  0.5450974  -3.142 0.001705 ** 
## MSZoningRL           -1.4176438  0.5191071  -2.731 0.006379 ** 
## MSZoningRM           -1.4876579  0.5188431  -2.867 0.004190 ** 
## KitchenAbvGr         -0.1011503  0.0302603  -3.343 0.000847 ***
## BsmtQualFa            0.0183597  0.1927585   0.095 0.924129    
## BsmtQualTA           -0.3314910  0.1726820  -1.920 0.055064 .  
## BsmtQualGd           -0.2697847  0.1801373  -1.498 0.134403    
## BsmtQualEx           -0.2182148  0.2020430  -1.080 0.280274    
## BedroomAbvGr          0.0953143  0.0246594   3.865 0.000115 ***
## GarageArea            0.0516732  0.0270152   1.913 0.055945 .  
## NeighborhoodBlueste  -0.1542176  0.3524052  -0.438 0.661720    
## NeighborhoodBrDale   -0.4428666  0.3001982  -1.475 0.140327    
## NeighborhoodBrkSide  -0.3808772  0.2485806  -1.532 0.125653    
## NeighborhoodClearCr  -0.1694251  0.2488964  -0.681 0.496149    
## NeighborhoodCollgCr  -0.3004361  0.2071347  -1.450 0.147117    
## NeighborhoodCrawfor   0.1522661  0.2267148   0.672 0.501915    
## NeighborhoodEdwards  -0.5164029  0.2202786  -2.344 0.019174 *  
## NeighborhoodGilbert  -0.2393987  0.2166424  -1.105 0.269295    
## NeighborhoodIDOTRR   -0.1020217  0.2653539  -0.384 0.700674    
## NeighborhoodMeadowV  -0.2999310  0.2690645  -1.115 0.265126    
## NeighborhoodMitchel  -0.3057085  0.2192598  -1.394 0.163413    
## NeighborhoodNAmes    -0.3022175  0.2135565  -1.415 0.157200    
## NeighborhoodNoRidge  -0.0347636  0.2255983  -0.154 0.877553    
## NeighborhoodNPkVill  -0.2690576  0.2647284  -1.016 0.309603    
## NeighborhoodNridgHt  -0.2035964  0.2094708  -0.972 0.331208    
## NeighborhoodNWAmes   -0.4121146  0.2221476  -1.855 0.063746 .  
## NeighborhoodOldTown  -0.3982939  0.2454429  -1.623 0.104823    
## NeighborhoodSawyer   -0.2667846  0.2230379  -1.196 0.231805    
## NeighborhoodSawyerW  -0.2929424  0.2135588  -1.372 0.170329    
## NeighborhoodSomerst  -0.3950661  0.2391018  -1.652 0.098656 .  
## NeighborhoodStoneBr   0.1923152  0.2331188   0.825 0.409504    
## NeighborhoodSWISU    -0.1174376  0.2506111  -0.469 0.639411    
## NeighborhoodTimber   -0.2665494  0.2255454  -1.182 0.237447    
## NeighborhoodVeenker  -0.6855417  0.2752387  -2.491 0.012841 *  
## MasVnrTypeBrkCmn     -0.3883002  0.2376023  -1.634 0.102389    
## MasVnrTypeBrkFace    -0.1914341  0.1736337  -1.103 0.270390    
## MasVnrTypeNone       -0.1344786  0.1725505  -0.779 0.435875    
## MasVnrTypeStone       0.0496893  0.1810936   0.274 0.783822    
## LandContourHLS       -0.1171351  0.1283545  -0.913 0.361585    
## LandContourLow        0.2049952  0.1587978   1.291 0.196903    
## LandContourLvl        0.1638895  0.0975324   1.680 0.093067 .  
## PavedDriveP          -0.0347417  0.1378177  -0.252 0.801006    
## PavedDriveY          -0.2569645  0.0840533  -3.057 0.002269 ** 
## BsmtFinSF1            0.0351069  0.0234029   1.500 0.133767    
## SaleConditionAdjLand -0.1089563  0.2819076  -0.386 0.699176    
## SaleConditionAlloca   0.0414905  0.2156927   0.192 0.847483    
## SaleConditionFamily  -0.0086768  0.1433526  -0.061 0.951742    
## SaleConditionNormal  -0.0080752  0.0684034  -0.118 0.906040    
## SaleConditionPartial  0.2177707  0.0977965   2.227 0.026090 *  
## KitchenQualTA         0.2534430  0.1162627   2.180 0.029398 *  
## KitchenQualGd         0.3382763  0.1240476   2.727 0.006456 ** 
## KitchenQualEx         0.3268288  0.1493955   2.188 0.028826 *  
## KitchenQual4          1.1163285  0.7215106   1.547 0.121995    
## BldgType2fmCon        0.0604991  0.1259780   0.480 0.631121    
## BldgTypeDuplex        0.1928015  0.1572213   1.226 0.220250    
## BldgTypeTwnhs        -0.2075289  0.1361443  -1.524 0.127608    
## BldgTypeTwnhsE       -0.2991519  0.0911214  -3.283 0.001047 ** 
## Total_porch_SF        0.0325171  0.0192367   1.690 0.091137 .  
## YrSold2007           -0.0085193  0.0492329  -0.173 0.862640    
## YrSold2008            0.0909927  0.0510370   1.783 0.074781 .  
## YrSold2009           -0.0380747  0.0506051  -0.752 0.451919    
## YrSold2010           -0.0185373  0.0599559  -0.309 0.757221    
## Fireplaces            0.0269230  0.0211580   1.272 0.203375    
## CentralAirY           0.1185801  0.0817818   1.450 0.147251    
## Total_Bathrooms       0.0336633  0.0277877   1.211 0.225889    
## GarageTypeAttchd     -0.0185379  0.1904233  -0.097 0.922459    
## GarageTypeBasment     0.0007755  0.2619324   0.003 0.997638    
## GarageTypeBuiltIn    -0.0011746  0.2036715  -0.006 0.995399    
## GarageTypeCarPort    -0.5154218  0.2793197  -1.845 0.065168 .  
## GarageTypeDetchd     -0.0909548  0.1906903  -0.477 0.633439    
## GarageTypeNA         -0.1684064  0.2179125  -0.773 0.439736    
## LotShapeIR2           0.0963568  0.1093177   0.881 0.378203    
## LotShapeIR3           0.0260381  0.2495993   0.104 0.916928    
## LotShapeReg           0.0717769  0.0395360   1.815 0.069622 .  
## FenceGdWo             0.1357585  0.1193715   1.137 0.255579    
## FenceMnPrv            0.0173171  0.0976095   0.177 0.859206    
## FenceMnWw            -0.3847589  0.2485646  -1.548 0.121823    
## FenceNA               0.0492736  0.0872320   0.565 0.572244    
## has2ndFloorTrue       0.0749505  0.0695501   1.078 0.281341    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.6855 on 1737 degrees of freedom
## Multiple R-squared:  0.553,  Adjusted R-squared:  0.5301 
## F-statistic: 24.15 on 89 and 1737 DF,  p-value: < 2.2e-16

Vemos que en este caso, las conclusiones a las que llegamos son similares y el R^2 ajustado sube un poco. No obstante, este modelo tiene muchas menos variables que el anterior y un poder predictor similar, con lo que es preferible al anterior.

Ahora realizaremos esto mismo para el modelo “Lasso”, mostrando en una gráfica generada por la librería “Caret” la importancia relativa de cada una de las variables:

varImp(lasso_mod)$importance %>% 
  as.data.frame() %>%
  rownames_to_column() %>%
  arrange(Overall) %>%
  filter(Overall != 0) %>%
  mutate(rowname = forcats::fct_inorder(rowname )) %>%
  ggplot()+
    geom_col(aes(x = rowname, y = Overall))+
    coord_flip()+
    theme_bw()

#lasso_coef = predict(lasso_mod$finalModel, type = "coefficients", s = bestlam)[1:20,]

Los coeficientes obtenidos para el modelo lasso son los siguientes:

coef(lasso_mod$finalModel, s = lasso_mod$bestTune$lambda)
## 169 x 1 sparse Matrix of class "dgCMatrix"
##                                   1
## (Intercept)           -0.7426858109
## GrLivArea              0.1531376612
## LotArea                0.0865640104
## Total_Bathrooms        0.0310840697
## Total_porch_SF         0.0178415503
## MSZoningC (all)        .           
## MSZoningFV             .           
## MSZoningRH            -0.1364812063
## MSZoningRL             0.0119321716
## MSZoningRM            -0.0991092770
## LandContourHLS        -0.0536440535
## LandContourLow         .           
## LandContourLvl         0.0041621048
## LotConfigCulDSac       .           
## LotConfigFR2           .           
## LotConfigFR3           .           
## LotConfigInside        .           
## Condition1Feedr        .           
## Condition1Norm         0.0296832468
## Condition1PosA         .           
## Condition1PosN         .           
## Condition1RRAe         .           
## Condition1RRAn         .           
## Condition1RRNe         .           
## Condition1RRNn         .           
## BldgType2fmCon         .           
## BldgTypeDuplex         .           
## BldgTypeTwnhs         -0.0394776413
## BldgTypeTwnhsE        -0.1429688842
## HouseStyle1.5Unf      -0.3475093752
## HouseStyle1Story       .           
## HouseStyle2.5Fin       .           
## HouseStyle2.5Unf       .           
## HouseStyle2Story       .           
## HouseStyleSFoyer       .           
## HouseStyleSLvl         .           
## RoofStyleGable         .           
## RoofStyleGambrel       .           
## RoofStyleHip           .           
## RoofStyleMansard      -0.1368216786
## RoofStyleShed          .           
## MasVnrTypeBrkCmn      -0.0660450609
## MasVnrTypeBrkFace      .           
## MasVnrTypeNone         .           
## MasVnrTypeStone        0.1127863850
## SaleTypeCOD            .           
## SaleTypeCon            0.0011879543
## SaleTypeConLD          .           
## SaleTypeConLI          .           
## SaleTypeConLw          .           
## SaleTypeCWD            .           
## SaleTypeNew            0.0662848641
## SaleTypeOth            .           
## SaleTypeWD            -0.0462479468
## SaleConditionAdjLand   .           
## SaleConditionAlloca    .           
## SaleConditionFamily    .           
## SaleConditionNormal    .           
## SaleConditionPartial   0.0768994485
## YearBuilt1930_1960     .           
## YearBuilt1960_1990     .           
## YearBuilt1990_         .           
## YearRemodAdd1930_1960 -0.0009057620
## YearRemodAdd1960_1990  .           
## YearRemodAdd1990_      0.0521908549
## MoSold2                .           
## MoSold3                .           
## MoSold4                .           
## MoSold5                .           
## MoSold6                .           
## MoSold7                .           
## MoSold8                0.0197148642
## MoSold9                .           
## MoSold10               .           
## MoSold11               .           
## MoSold12               .           
## YrSold2007             .           
## YrSold2008             0.0402098401
## YrSold2009            -0.0054804119
## YrSold2010             .           
## OverallQual            0.0790865502
## OverallCond            0.0361333646
## PavedDriveP            .           
## PavedDriveY           -0.0477083771
## FenceGdWo              0.0002942089
## FenceMnPrv             .           
## FenceMnWw             -0.1842428850
## FenceNA                .           
## BsmtFinSF1             0.0276593056
## ExterQualTA           -0.0092085245
## ExterQualGd            0.0442833736
## ExterQualEx            .           
## BsmtQualFa             0.0013585470
## BsmtQualTA            -0.1161156588
## BsmtQualGd             .           
## BsmtQualEx             0.0348489405
## BsmtExposureNo        -0.0055491792
## BsmtExposureMn         .           
## BsmtExposureAv         .           
## BsmtExposureGd         .           
## BsmtFinType1Unf        .           
## BsmtFinType1LwQ        .           
## BsmtFinType1Rec        .           
## BsmtFinType1BLQ        .           
## BsmtFinType1ALQ        .           
## BsmtFinType1GLQ        .           
## BsmtUnfSF              .           
## CentralAirY            0.1264125792
## KitchenQualTA          .           
## KitchenQualGd          0.0272496938
## KitchenQualEx          0.0066276444
## KitchenQual4           .           
## Fireplaces             0.0200030093
## FireplaceQuPo          .           
## FireplaceQuFa          .           
## FireplaceQuTA          .           
## FireplaceQuGd          .           
## FireplaceQuEx          .           
## BedroomAbvGr           0.0840212903
## KitchenAbvGr          -0.0486054527
## LotShapeIR2            .           
## LotShapeIR3            .           
## LotShapeReg            .           
## GarageArea             0.0583925239
## GarageCondFa           .           
## GarageCondTA           .           
## GarageCondGd           .           
## GarageCondEx           .           
## GarageCondNA           .           
## NeighborhoodBlueste    .           
## NeighborhoodBrDale    -0.0265115296
## NeighborhoodBrkSide   -0.0579516533
## NeighborhoodClearCr    .           
## NeighborhoodCollgCr    .           
## NeighborhoodCrawfor    0.1640978189
## NeighborhoodEdwards   -0.1720832086
## NeighborhoodGilbert    .           
## NeighborhoodIDOTRR     0.0046569595
## NeighborhoodMeadowV    .           
## NeighborhoodMitchel    .           
## NeighborhoodNAmes      .           
## NeighborhoodNoRidge    0.1110983961
## NeighborhoodNPkVill    .           
## NeighborhoodNridgHt    .           
## NeighborhoodNWAmes     .           
## NeighborhoodOldTown   -0.1202088440
## NeighborhoodSawyer     .           
## NeighborhoodSawyerW    .           
## NeighborhoodSomerst    .           
## NeighborhoodStoneBr    0.1400781249
## NeighborhoodSWISU      .           
## NeighborhoodTimber     .           
## NeighborhoodVeenker   -0.1561080656
## has2ndFloorTrue        .           
## AlleyNA                .           
## AlleyPave              .           
## TotalSF                0.1816735600
## GarageTypeAttchd       0.0266951617
## GarageTypeBasment      .           
## GarageTypeBuiltIn      0.0102332021
## GarageTypeCarPort     -0.2808298809
## GarageTypeDetchd      -0.0175440059
## GarageTypeNA           .           
## MasVnrArea             .           
## FoundationCBlock       .           
## FoundationPConc        0.0017520199
## FoundationSlab         .           
## FoundationStone        .           
## FoundationWood         .

Ahora comprobaremos mediante una serie de gráficos si se cumplen las hipótesis necesarias para la valided de los modelos de regresión. Comenzaremos con el modelo de regresión total:

par(mfrow=c(2,2))
plot(modelRegressionTotal)
## Warning: not plotting observations with leverage one:
##   794, 1417

## Warning: not plotting observations with leverage one:
##   794, 1417

Comprobamos con los anteriores gráficos los siguientes puntos:

Ahora dibujaremos un diagrama donde se muestran las distancias de cook de las distintas observaciones. Vemos que, efectivamente, hay observaciones como las 358 y 182 que son outliers aunque no hemos determinado por qué.

plot(modelRegressionTotal,4,id.n=5)

Ahora repetiremos este mismo análisis en el modelo “Step BackWards” con los siguientes gráfico:

par(mfrow=c(2,2))
plot(modelStepForward$model)
## Warning: not plotting observations with leverage one:
##   1417

## Warning: not plotting observations with leverage one:
##   1417

plot(modelStepForward$model,4,id.n=5)

Comprobamos exactamente los mismos problemas que en el caso anterior, lo que indica que el modelo tiene también serios problemas.

Por último, realizaremos el mismo anális con el modelo lasso:

library(plotmo)
## Loading required package: Formula
## Loading required package: plotrix
## 
## Attaching package: 'plotrix'
## The following object is masked from 'package:scales':
## 
##     rescale
## Loading required package: TeachingDemos
## 
## Attaching package: 'TeachingDemos'
## The following object is masked from 'package:corrr':
## 
##     dice
plotres(lasso_mod)

Observamos los mismos problemas que en el caso anterior. Los residuos no se distribuyen aleatoriamente en todas las observaciones y existe fuerte heteroestaticidad que no hemos sido capaces de quitar.

A la hora de interpretar el significado de los parámetos beta del modelo, debemos tener en cuenta los cambios de variable que hemos hecho. La variable “SalePrice” que queremos inferir tiene una transformación logarítmica. Por ello, agruparemos los parámetros en 2 categorías:

*Variables regresoras que han sufrido una transformación log(X): en este caso la interpretación para un coeficiente beta dado (dejando el resto de las variables regresoras constantes) %incremento(SalePrice)= Beta* %incremento(Variable)
*Variables regresoras que han sufrido una transformación log(X+1):
*Variables que no han sufrido transformación y que son contínuas: en este caso la interpretación para un coeficiente beta dado (dejando el resto de las variables regresoras constantes) %incremento(SalePrice)= 100*Beta* %incremento(Variable)

Hay que tener en cuenta que todas las variables numéricas han sido centradas y normalizadas para tener varianza uno. La siguiente función desharia el cambio de variable para poder comparar los precios originales con los precios transformados:

revPredict <- function(preproc, data, digits=0) {
  data %>%
    select(one_of(preproc$mean %>% names)) %>%
    map2_df(preproc$std, ., function(sig, dat) dat * sig) %>%
    map2_df(preproc$mean, ., function(mu, dat) dat + mu)
}